W trakcie przygotowywania warsztatu do pracy utworzyliśmy zalążek naszego projektu. Jednak zanim zagłębimy się w niego i wypełnimy treścią, czas na teoretyczne zapoznanie się z najważniejszymi pojęciami jakie będziemy wykorzystywać.
W tej lekcji przekazuję wiedzę teoretyczną, bo zaprzyjaźnienie się z kilkoma terminami pozwoli nam lepiej zrozumieć to, co będzie się działo w trakcie realizacji projektu dla naszego kolegi Jacka.
Na chwilę odejdźmy więc od zlecenia jakie dostaliśmy i chodźmy na spacer przemyśleć kilka spraw…
Jak już wspomniałem w części poświęconej obiektom – język C# jest językiem obiektowym. W tym wypadku związane jest to z obecnością czegoś co nazywa się klasą. Słowo samo w sobie jest na pewno każdemu z nas znane. Dowiedzmy się jednak co oznacza w aktualnie omawianym przypadku.
We jednej z wcześniejszych lekcji dowiedzieliśmy się już czym są obiekty. Weźmy więc jako przykład obiekty ze świata rzeczywistego. Niech to będzie głośnik. Być może jakiś stoi na Twoim biurku. Ja mam dwa przed oczami.
Są to bez wątpienia istniejące, fizyczne obiekty. Konkretne egzemplarze, które wyszły z fabryki. Gdzieś w innym domu ktoś patrzy na taki sam model głośników. Jednak nie są to dokładnie te same fizyczne egzemplarze.
Jedyne co je łączy to fakt, że powstały według tego samego schematu. Według tego samego projektu. Nie musiały powstać w jednej fabryce, w jednym miejscu.
Ważne, że posiadają takie same cechy i zachowania, bo jakiś zespół projektantów przygotował schemat wg którego mają zostać wyprodukowane. Łączy je też nazwa modelu pod jaką są sprzedawane.
Nie bez powodu podkreślam tu słowo schemat. Bo właśnie do takiego schematu, projektu na papierze można porównać klasę z języka C#. Przynajmniej na poziomie na jakim się w tych naszych lekcjach będziemy poruszali przez większość czasu.
Klasy są to więc opisy tego jak wyglądać będą i zachowywać się obiekty, jakie na ich podstawie utworzymy. Będą to te same modele, a więc obiekty tego samego typu, powstałe z jednej klasy. Będą się różnić „numerem seryjnym” lub niektórymi parametrami jeżeli jakieś wartości, takie jak kolor, mogą być zmieniane. Jednak wszystkie powstaną według jednego projektu – utworzonej przez nas klasy.
Co więcej projekt omawianych przez nas głośników będzie prawdopodobnie zakładał użycie komponentów, które powstają na podstawie innych projektów. Są to obiekty innych klas, z których możemy korzystać aby zbudować to co potrzebujemy. I będą one uwzględnione na schemacie jako gotowe klocki, których po prostu używamy.
Tak mówimy o tych obiektach i mówimy. Ale o ile w prawdziwym życiu jakiś obiekt możemy zobaczyć i trzymać w ręce tak w programie chyba nie jest to możliwe? Bo nie jest to coś co możemy jakoś złapać, dotknąć, zamknąć w opakowaniu, prawda?
Nie do końca. Jest sposób aby móc „trzymać”, „przechowywać” nasze obiekty. Tym sposobem są zmienne. Możemy je sobie wyobrazić jako pojemniki do przechowywania konkretnego typu substancji.
Tak jak mamy osobne pojemniki na benzynę, gaz, czy zupę tak samo zmienne są przystosowane do przechowywania konkretnego typu obiektów.
Wróćmy do analogii z produkcją głośników.
Mamy opis budowy konkretnych modeli głośników. Załóżmy, że fabryka produkuje głośniki SUPERBASS i głośniki NICESOUND. Te nazwy to są nasze klasy wspomniane trochę wcześniej. To co fizycznie otrzymujemy to obiekty tych klas. Są to konkretne egzemplarze i są one określonego typu.
I teraz mając wyprodukowane te egzemplarze chcemy je zapakować do wysyłki. Co wtedy robimy? Pakujemy głośniki typu SUPERBASS do pudełek przeznaczonych na model SUPERBASS, a głośniki typu NICESOUND lądują w pudełkach z nadrukowanym zdjęciem modelu NICESOUND. I właśnie takimi pudełkami są zmienne. Są przeznaczone na konkretny typ obiektu.
Dobra nasza. Mamy już schemat głośnika. Wyprodukowaliśmy też egzemplarz tego głośnika, który ma określony kolor, wielkość itd. Mamy też pudełko, do którego ten głośnik możemy spakować aby potem móc go przetransportować i sprzedać.
Ale nadal nie wiemy czy nasz głośnik jest czymś więcej niż eksponatem na półkę. Co właściwie może robić? Po co są wszystkie umieszczone na nim pokrętła?
Nie dowiedzieliśmy się również co odpowiada za te wszystkie czynności naokoło, takie jak transport czy składanie głośników.
Tym brakującym elementem, który opisuje zachowania i czynności są metody/funkcje. Dla uproszczenia będziemy korzystać z tych terminów zamiennie i również takie ich używanie jest dosyć częstą praktyką.
Także jeżeli gdzieś w tekście będzie się pojawiać słowo „metoda” to będzie to równoznaczne z użytym w innym miejscu słowem „funkcja”.
Jeżeli ktoś chce się dowiedzieć jakie różnice można pomiędzy tymi słowami wyróżnić to może przeczytać chociażby tę rozmowę na StackOverflow.
Jednak jeżeli dopiero zaczynasz naukę programowania obiektowego to nie polecam mieszać sobie w głowie i próbować zrozumieć tych różnic.
Słowo „funkcja” jest Ci zapewne znane chociażby z lekcji matematyki. Podając wartość x dostawaliśmy wynik jakiegoś równania, korzystając z równania jakie było w tej funkcji. I m.in. w taki sposób działają funkcje w programowaniu.
Z tym, że zarówno jakaś wartość początkowa jak i zwracanie wyniku są opcjonalne. To znaczy, że możemy dostać wynik bez podawania wartości początkowej jak również podać wartość, z której bezpośrednio nie otrzymamy konkretnego wyniku.
Jeżeli będziemy się nadal trzymali obrazowych porównań to funkcje w naszych programach możemy porównać też do czynności.
Pozostając w temacie głośników.
Jedną z ich funkcji jest zamiana sygnału elektrycznego w dźwięk. Ta funkcja dostaje z kabla jakiś sygnał elektryczny i na wyjściu zwraca dźwięk, który słyszymy. To co dzieje się pomiędzy to właśnie funkcja.
Korzysta ona z obiektów, takich jak wzmacniacz. Korzysta też z funkcji tych obiektów. One zaś mogą korzystać z kolejnych, mniejszych obiektów, używać ich funkcji, zwracać jakiś rezultat itd.
W ten sposób wykonywane jest jakieś działanie.
Inną funkcją dostępną w głośniku jest zmiana głośności. Kręcąc pokrętłem zmieniamy poziom głośności dźwięku na jaki zamieniany jest sygnał elektryczny. Takich operacji możemy wymienić jeszcze kilka. Wszystkie one są funkcjami wyprodukowanych przez nas głośników.
Rysujemy schemat. Fabryka na jego podstawie produkuje obiekty (korzystając być może z innych obiektów). Są one pakowane do odpowiednich pudełek, a następnie pozwalają wykonywać określone czynności.
Posługując się takim ciągiem wydarzeń możemy opisać klasę, zmienną i funkcję. A teraz, kiedy te pojęcia są nam znane możemy przystąpić do realizacji zadania jakie zostało przed nami postawione!
Poprzednia lekcja – wyposażamy warsztat
Następna lekcja – zacznijmy od rusztowania
Ależ to jasno, przejrzyście, żeby nie powiedzieć klarownie, a przy tym ciekawie i zabawnie napisane :-) Szkoda, że większość wiedzy nie jest przekazywana w ten sposób. Wszyscy bylibyśmy wtedy Einstein’ami ;-)