Zrozumieć programowanie obiektowe

Dekoracja: noc, człowiek świeci latarką w gwieździste niebo
Obraz FelixMittermeier z Pixabay

Być może usłyszałeś kiedyś takie zdanie:

Język C# jest językiem silnie zorientowanym obiektowo.

Ta strona jest skierowana do osób, które przed rozpoczęciem mojego kursu nie miały styczności z programowaniem, zatem istnieje duże prawdopodobieństwo, że zastanawiasz się o co w powyższym zdaniu chodzi. Spróbujmy więc wspólnie ten temat rozgryźć.

Uwaga, trudne słowo: paradygmat

Programowanie obiektowe to jeden z paradygmatów programowania. Istnieje wiele paradygmatów, ale żeby nie być gołosłownym wymienię kilka z nich:

  • programowanie obiektowe (OOP – Object Oriented Programming),
  • programowanie funkcyjne (FP – Functional Programming),
  • programowanie proceduralne (PP – Procedural Programming).

W dzisiejszym świecie informatyki programowanie obiektowe jest jednym z najpopularniejszych paradygmatów, a C# jest jednym z języków, które wyjątkowo mocno brną właśnie w ten paradygmat. Jeśli przejrzymy oferty pracy dla programistów, stosunkowo dużo znajdziemy ofert dla programistów Javy, C# czy C++. Wszystkie trzy języki mocno wspierają programowanie obiektowe, a pierwsze dwa bez niego praktycznie nie istnieją.

Z powyższych akapitów wyłania się wstępny wniosek, że paradygmat jest czymś, co narzuca określony wzorzec projektowania aplikacji oraz, że określone języki programowania mniej lub bardziej wspierają któryś paradygmat programowania.

Dekoracja: człowiek z żarówką zamiast głowy
Photo by Esa Oksman from FreeImages

Paradygmat programowania definiuje sposób patrzenia programisty na przepływ sterowania i wykonywanie programu komputerowego. Przykładowo, w programowaniu obiektowym jest on traktowany jako zbiór współpracujących ze sobą obiektów, podczas gdy w programowaniu funkcyjnym definiujemy, co trzeba wykonać, a nie w jaki sposób.

https://pl.wikipedia.org/wiki/Paradygmat_programowania

W powyższym cytacie z Wikipedii nieprzypadkowo pogrubiłem fragment mówiący o tym, że paradygmat programowania obiektowego jest traktowany jako zbiór współpracujących ze sobą obiektów. No bo…

Co to jest obiekt?

Jest to struktura zawierająca:
– dane
– metody, czyli funkcje służące do wykonywania na tych danych określonych zadań.

https://pl.wikipedia.org/wiki/Obiekt_(programowanie_obiektowe)

Jeśli oglądałeś pierwsze kilka odcinków mojego kursu C# na YouTube, to zapewne powyższy cytat z Wikipedii trochę Ci rozjaśni sytuację. Słowo metoda padło w nich wiele razy. Jeśli chodzi o słowo dane to podpowiem, że w tym przypadku jest to odpowiednik pojęcia właściwość, które również padło w tych odcinkach wiele razy. Oba te pojęcia pojawiły się w kontekście klasy.

Czy obiekt to klasa?

Nie. Ale klasa to szablon obiektu. Można również powiedzieć, że to wzorzec lub makieta obiektu. Z jednej klasy może powstać dowolna ilość obiektów, które od klasy przejmują zarówno właściwości jak i metody.

Dla jasności – te dwa rodzaje elementów to nie są jedyne elementy, jakie może posiadać klasa czy obiekt, ale te dwa rodzaje zostały poniekąd omówione w pierwszych odcinkach mojego kursu, dlatego to na nich opieram ten artykuł.

Jeśli porównać programistę do kucharza piekącego ciastka, to foremka do ciasta (która jest narzędziem kucharza) jest odpowiednikiem klasy (która jest narzędziem programisty w paradygmacie obiektowym), natomiast wykrojone z rozwałkowanego ciasta ciastka to odpowiedniki obiektów w programowaniu.

Dekoracja: forma do wykrawania ciastek w kształcie ludzika
Photo by S. Schleicher from FreeImages

Stan i zachowanie obiektu

Wspomniane wyżej właściwości (lub dane jeśli podążać za definicją z Wikipedii) określają stan obiektu, a metody określają jego zachowanie. Jeśli przypomnimy sobie pierwszy odcinek kursu, to mieliśmy tam do czynienia z klasą Console. Poprzez właściwości ustawialiśmy takie parametry konsoli jak tytuł okna konsoli, kolor tła konsoli, kolor tekstu itp. To wszystko, co w danym momencie jest zapisane we właściwościach obiektu nazywamy jego stanem (ang. state).

Metodami sprawialiśmy, że konsola wykonywała pewne czynności (zachowania), np. wyświetlała napis, czyściła ekran lub pauzowała wykonywanie w oczekiwaniu na wciśnięcie przycisku przez użytkownika. Wszystkie te rzeczy, a także wszystkie inne, które wykonywane są przy pomocy metod, określają zachowanie obiektu (ang. behavior).

A może jakiś przykład łączący programowanie z prawdziwym życiem?

Klasa Console to specyficzny przypadek, bo jest to klasa statyczna (to pojęcie wyjaśnię innym razem), więc nie jest to najlepszy przykład, jednak jeden z niewielu, jaki do tej pory pojawił się w moim kursie, dlatego też do niego się odwołałem. Ale powiedzmy, że mamy klasę Latarka, która jak sama nazwa wskazuje jest specyfikacją latarki. Z tej specyfikacji powstają obiekty w postaci działających latarek. Specjalne podziękowania dla Dawida, który podpowiedział by obiekty wytłumaczyć Wam na podstawie latarki 🙂

Dekoracja: latarka
Photo by Ray Smithers from FreeImages

Co możemy określić jako stan latarki (obiektu)? Na przykład to, czy latarka w danym momencie świeci (jest włączona), czy też nie (jest wyłączona). Taką informację można byłoby odczytać z właściwości, która mogłaby się nazywać np. Włączona (pisząc w sposób podobny jak robiliśmy to przy klasie Console, wyglądałoby to tak: Latarka.Włączona). Właściwość jest specyficznym rodzajem zmiennej, zatem jeśli oglądałeś odcinek o typie logicznym, to wiesz, że właściwość ta będzie mogła mieć wartość true lub false.

Jeśli nasza klasa nie narzuca koloru latarki i mamy udostępnioną właściwość Kolor, to stanem latarki będzie również jej kolor zapisany we właściwości Kolor.

A co będzie zachowaniem latarki? Na pewno włączanie i wyłączanie. Zatem latarka powinna mieć metodę Włącz() oraz metodę Wyłącz(). Użycie tych metod będzie się odwoływało do zachowania latarki oraz wpłynie na jej stan – nasza właściwość Włączona zmieni swoją wartość po użyciu odpowiedniej metody.

Będące wewnątrz latarki baterie to również obiekty, których stanem może być np. pojemność, czy poziom naładowania. Ponadto między tymi obiektami możemy określić powiązanie, jednak ten temat omówimy innym razem, by artykuł nie stał się nazbyt skomplikowany dla początkujących programistów.

No dobrze, tyle teorii… to może jakaś praktyka?

Aby zobaczyć jak wygląda omawiany temat w praktyce, zapraszam serdecznie do obejrzenia najnowszego odcinka kursu C# od zera na YouTube 🙂

Podsumowanie

Na koniec wypada wyjaśnić, co w takim razie oznacza poniższe zdanie.

Język C# jest językiem silnie zorientowanym na programowanie obiektowe.

Otóż język C# jest językiem, którego fundamentem jest OOP, czyli programowanie obiektowe. Oznacza to, że w tym języku praktycznie nie da się napisać programu bez użycia klas i obiektów. Nawet kiedy uruchamiamy program „Hello World”, jego kod jest zawarty w klasie Program. Jest to oczywiście bardzo specyficzna klasa, ale jednak nadal klasa.

Programu „Hello World” nie jesteśmy w stanie napisać bez klasy Console. Jeśli chcemy napisać jakikolwiek nieco bardziej skomplikowany program, powinniśmy użyć do tego kolejnych klas i obiektów.

Na razie w moim kursie dla ułatwienia pokazywałem nieco bardziej proceduralny styl kodu, jednak przekonacie się, że jest to ułatwienie jedynie na samym początku nauki. Z czasem takie podejście stanie się ogromnym utrudnieniem, ponieważ na podejściu proceduralnym mocno cierpi jakość i czytelność kodu programu.

Dodaj komentarz