Programowanie Obiektowe – jesteś zwierzęciem, ssakiem, czy jednak 'bytem’…?
Jako człowiek🧍, jestem zwierzęciem 🐿️, ssakiem, istotą ożywioną? – Czy może jeszcze czymś innym?
Może jestem programistą? Albo rodzicem 🤰, bądź dzieckiem 👶?
Tak naprawdę każdym z nich po trochu i wszystkimi jednocześnie – w zależności od potrzeby chwili – teraz np. jestem copywriterem ✍️
W ramach tego materiału dowiesz się, czym jest programowanie obiektowe (ang. Object Oriented Programming) i jak z nim pracować.
Spis treści
- 1 Programowanie obiektowe – wprowadzenie
- 2 Paradygmaty programowania
- 3 Programowanie obiektowe (ang. Object Oriented Programming)
- 4 Programowanie obiektowe – Od czego zacząć?
- 5 Programowanie obiektowe – Pamiętaj!
- 6 Obiekty i klasy
- 7 Obiekty i klasy – Zmienne i metody
- 8 Programowanie obiektowe – Po co to nam?
- 9 Paradygmaty programowania obiektowego (ang. oop principles) – Czyli zasady, z których należy korzystać
- 10 Java vs. Programowanie Obiektowe
- 11 Programowanie obiektowe – Podsumowanie
- 12 20+ BONUSOWYCH materiałów z programowania
Programowanie obiektowe – wprowadzenie
Z tego materiału dowiesz się:
- Czym jest programowanie obiektowe?
- Jak tworzyć aplikację wykorzystując programowanie obiektowe?
- Jakie są paradygmaty programowania obiektowego?
- Jak programuje się obiektowo w Javie?
Paradygmaty programowania
Paradygmaty programowania – to różne sposoby, w których dany program lub język programowania może być zorganizowany. Każdy paradygmat składa się z pewnych struktur, cech i opinii na temat tego, jak należy rozwiązywać typowe problemy programistyczne.
Programowanie obiektowe (ang. Object Oriented Programming)
Programowanie obiektowe (ang. OOP — Object Oriented Programming) to popularny paradygmat programowania, w którym modelujemy istniejącą rzeczywistość za pomocą obiektów, zamiast stosować tylko funkcje i logikę.
Projektowanie obiektowe polega na umiejętności przedstawienia sytuacji z życia codziennego pod postacią obiektów i relacji między nimi.
Obiekty to elementy łączące stan – czyli przechowywane dane, nazywane często polami oraz zachowanie – czyli procedury/metody.
Jest to odmienne podejście od tradycyjnego programowania proceduralnego, gdzie dane i metody nie są ze sobą tak ściśle związane. Celem OOP jest ułatwienie modelowania aplikacji oraz późniejszego pisania, konserwacji i potencjalnego ponownego użycia kodu.
Ogromną zaletą programowania obiektowego jest jego zgodność ze światem rzeczywistym. Takie podejście możemy rozmieć, jako próbę przedstawienia świata rzeczywistego i relacji w nim zachodzących pod postacią obiektów i klas.
Obiektowy program komputerowy to zbiór takich obiektów, komunikujących się pomiędzy sobą w celu wykonywania określonych zadań.
Programowanie obiektowe – Od czego zacząć?
Nasze pierwsze aplikacje bardzo często pisane są w podejściu proceduralnym – czyli takim, w którym mamy jedną główną metodę, w której piszemy całą naszą logikę. Czasem wydzielamy jakieś dodatkowe metody (procedury), jednak większość kodu trzymana jest w jednym pliku. Tak właśnie powstają „potworki” 👹 po 1000 linii kodu, czasem po 3000 i więcej. Rekordzista, którego widziałem miał prawie 20 000 linijek kodu 😬 w jednym pliku – IDE wieszało się przy każdej próbie uruchomienia pliku, dlatego trzeba było edytować go w notatniku…
Zdecydowanie nie tędy droga. 🙂 – Pierwsze kroki z OOP
Wyobraź sobie, że Twoim zadaniem jest zaprojektowanie aplikacji obiektowej np. dla:
- Biblioteki
- Sklepu monopolowego
- Szkoły językowej
- Dowolnej innej sytuacji, z którą chcesz się zmierzyć.
Umiejętność pisania dobrego kodu, (czyli również projektowanie obiektowe) często jest na pograniczu sztuki i twardych umiejętności technicznych. Co to tak naprawdę znaczy dla Ciebie i jak ugryźć ten temat?
- Zacznij od przygotowania pełnego opisu Twojego problemu. Zastanów się 💡 „jak to ma działać?” i zbierz wszystkie możliwe informacje w formie prostego tekstu
- W kolejnych krokach zidentyfikuj rzeczowniki, czasowniki i przymiotniki:
- Rzeczowniki to kandydaci na klasy i obiekty
- Czasowniki to metody naszych klas
- Przymiotniki to kandydaci na pola (cechy)
Każdy obiekt ma swój stan (czyli dane, nazywane najczęściej polami) oraz zachowanie (czyli procedury, w tym przypadku – metody) – przykładowo obiekt może reprezentować konkretną osobę np.
Tomka 👦🏻 – Tomek ma swoje imię, nazwisko, wiek oraz zachowanie np. mówi, śpi, programuje itp.
Programowanie obiektowe – Pamiętaj!
Pamiętaj!
Nie wszystkie wymagania są już na samym początku jawne – niektóre relacje i pola trzeba będzie zwyczajnie dodać. Mimo wszystko takie podejście jest dobrym punktem wyjścia do dalszych prac.
Zabierając się za tworzenie aplikacji, wykorzystując programowanie obiektowe, warto odpowiedzieć sobie również na samym początku na wiele pytań, która nasuwają się podczas pracy z obiektami, np.:
- Co w danym wypadku lepiej się sprawdzi: dziedziczenie, czy kompozycja?
- Czy zastosować interfejs, czy też klasy abstrakcyjne?
- Jak stworzyć jak najlepszą hermetyzację danych?
- Itp.
Warto zrobić przynajmniej raz takie ćwiczenie, bo dzięki temu każdy kolejny raz będzie już dużo prostszy.
Obiekty i klasy
Klasa, z punktu widzenia programowania to typ zmiennej. W ujęciu projektowym ogólna definicja pewnej grupy obiektów, które różnią się tożsamością. Klasa definiuje metody, czyli funkcjonalności, które są dostarczane przez obiekty.
Definiuje też atrybuty, które są indywidualne dla konkretnych obiektów.
Każdy obiekt jest instancją konkretnej klasy np. Tomek jest instancją klasy człowiek. Procedury w OOP nazywane są metodami, a zmienne obszarami, członkami, atrybutami, właściwościami.
Obiekty i klasy – Zmienne i metody
- Zmienne klasy — należą do całości klasy, jest tylko jedna kopia każdej
- Instancje zmiennych lub atrybutów — dane, które należą do indywidualnych obiektów, każdy obiekt ma własną
- Zmienne składowe — odwołują się zarówno do klas, jak i zmiennych instancji
- Metody w klasach — należą do całości klas i mają dostęp tylko do zmiennych klas oraz wprowadzanych w wywoływaniu procedur
- Metody instancji – należą do indywidualnych obiektów, mają dostęp do zmiennych instancji dla specyficznych obiektów, dla których są wywoływane, wprowadzanych oraz zmiennych klas
Programowanie obiektowe – Po co to nam?
Programowanie obiektowe z założenia ma ułatwić nam:
- Pisanie kodu
- Utrzymanie kodu
- Wielokrotne użycie kodu lub jego fragmentów
- Możliwość równoległej pracy wielu deweloperów
W teorii brzmi pięknie 🌻 – w praktyce różnie to bywa…
Pamiętajmy, że OOP to tylko narzędzie 🛠️ i to od nas zależy, jak z niego skorzystamy. Tworząc aplikację wykorzystując OOP, szybko zauważysz zalety tego podejścia, szczególnie gdy zechcesz ją rozbudować.
Paradygmaty programowania obiektowego (ang. oop principles) – Czyli zasady, z których należy korzystać
Główne paradygmaty programowania obiektowego:
- Abstrakcja
- Enkapsulacja
- Dziedziczenie
- Polimorfizm
Abstrakcja | klasa abstrakcyjna (ang. Abstract class)
Klasa abstrakcyjna różni się od zwykłej klasy tym, że nie można utworzyć jej instancji. Może jednak dostarczyć metod zdefiniowanych i abstrakcyjnych, które muszą zostać zdefiniowane w klasach potomnych.
Mammals jest abstrakcyjny, ponieważ, mimo że ssakiem jest pies i człowiek to nie można utworzyć tylko ssaka, który nie będzie żadnym z podgatunków. Dzięki takiemu zamodelowaniu wiemy jednak, że jesteśmy ssakami.
Interfejs (ang. Interface)
Interfejs to specyficzna forma abstrakcji. Od klasy abstrakcyjnej różni się głównie tym, że:
- nie może definiować atrybutów, tylko metody i stałe,
- wszystkie metody muszą być abstrakcyjne i publiczne (od Javy 8 wprowadzone zostały również metody default’owe).
Dzięki interfejsom można zapewnić pożądane funkcjonalności – są pewnego rodzaju kontraktem między klasami, które implementując go, wykorzystują jego funkcję.
Interfejs gwarantuje, że jakaś metoda istnieje, a nie jak się konkretnie zachowuje.
Ssaki, jak wszystkie inne zwierzęta, poruszają się i jedzą. Niemniej jednak inaczej przemieszczają się ryby, inaczej ptaki, a inaczej ludzie. To samo tyczy się jedzenia.
W ramach tego materiału zajmiemy się przede wszystkim poznaniem tematu programowania obiektowego – natomiast szersze rozwinięcie tematu abstrakcji znajdziesz poniżej.
➡ ZOBACZ 👉:
Hermetyzacja
Hermetyzacja polega na ukryciu informacji (szczegółów implementacji), które nie powinny być widoczne poza klasą lub modułem.
Hermetyzacja może być używana do ukrywania zarówno członków danych, jak i metod związanych z instancją klasy lub obiektu.
Aby to osiągnąć, należy:
- Zadeklarować zmienne lub metody klasy jako prywatne
- Zapewnić publiczne metody get i set, aby uzyskać dostęp i aktualizować wartość prywatnej zmiennej
Enkapsulacja (ang. Encapsulation)
Enkapsulacja odnosi się do wiązania danych, wspólnie z metodami operującymi na tych danych, w jedną całość.
Przykładem enkapsulacji jest klasa, ponieważ składa się z danych i metod, które zostały połączone w jedną całość.
W ramach tego materiału zajmiemy się przede wszystkim poznaniem tematu programowania obiektowego – natomiast szersze rozwinięcie tematu hermetyzacji znajdziesz poniżej.
➡ ZOBACZ 👉: W opracowaniu 🙂 Wkrótce pojawi się tutaj link do ciekawych treści!
Dziedziczenie (ang. Inheritance)
Dziedziczenie jest mechanizmem, w którym można stworzyć nową klasę, bazując na już istniejącej (nadrzędnej) klasie tzw. superklasie. Klasa macierzysta dzieli zestaw publicznych lub chronionych (ang. protected) atrybutów i metod z klasą dziecka.
W celu dziedziczenia po klasie nadrzędnej należy użyć słowa kluczowego „extends”, aby zidentyfikować klasę, którą rozszerza twoja podklasa. Jeśli superklasa nie zostanie zadeklarowana, klasa domyślnie rozszerzy klasę Object.
Klasa Object jest podstawą wszystkich hierarchii dziedziczenia. Jest to jedyna klasa w Javie, która nie rozszerza innej klasy.
W ramach tego materiału zajmiemy się przede wszystkim poznaniem tematu programowania obiektowego – natomiast szersze rozwinięcie tematu dziedziczenia znajdziesz poniżej.
➡ ZOBACZ 👉: W opracowaniu 🙂 Wkrótce pojawi się tutaj link do ciekawych treści!
Polimorfizm – wielopostaciowość (ang. Polymorphism)
Polimorfizm to zdolność obiektu do przybierania różnych form. Występuje np., w sytuacji, gdy korzysta się z wielu klas, powiązanych ze sobą poprzez dziedziczenie. Sprowadza się to do tego, że polimorfizm pozwala na wykonanie wielu implementacji poprzez zdefiniowanie jednego interfejsu.
Wielopostaciowość pozwala wykonać tę samą czynność na wiele różnych sposobów.
W ramach tego materiału zajmiemy się przede wszystkim poznaniem tematu programowania obiektowego – natomiast szersze rozwinięcie tematu polimorfizmu znajdziesz poniżej.
➡ ZOBACZ 👉: W opracowaniu 🙂 Wkrótce pojawi się tutaj link do ciekawych treści!
Java vs. Programowanie Obiektowe
Java jest językiem zorientowanym obiektowo, który co prawda ma typy proste jak chociażby int, czy long do przechowywania liczb – ale ma również wszystko to, co jest niezbędne, by napisać pełnoprawne obiektowe aplikacje.
Podstawa to oczywiście klasy i obiekty.
O klasach możemy myśleć, jak o szablonach (wzorach), na podstawie których powstają konkretne obiekty – np. takim szablonem może być klasa Client, a konkretnym obiektem powstałym na podstawie tej klasy „Tomek”.
Kod przygotowany według zasad projektowania obiektowego stara się odzwierciedlać rzeczywistość, co z założenia jest bardziej naturalnym sposobem przetwarzania informacji przez człowieka. Widać to na przykładzie, gdzie mamy obiekt umowy („agreement”) i wywołujemy na nim metodę podpisania 📝 („agreement.sign()”) przekazując jednocześnie niezbędne informacje.
Programowanie obiektowe – Podsumowanie
W ramach tego materiału poznaliśmy jeden z paradygmatów programowania, jakim jest projektowanie obiektowe. Dowiedzieliśmy się też o zbiorze mechanizmów, jakie wykorzystuję się, w programowaniu obiektowym m.in. poznaliśmy temat abstrakcji, hermetyzacji, dziedziczenia oraz polimorfizmu.
Jeżeli chcesz kontynuować swoją przygodę z Javą i programowaniem obiektowym – to zapraszam do mojego kursu „Kierunek Java”:
➡ ZOBACZ 👉: Kierunek Java
20+ BONUSOWYCH materiałów z programowania
e-book – „8 rzeczy, które musisz wiedzieć, żeby dostać pracę jako programista”,
e-book – „Java Cheat Sheet”,
checklista – „Pytania rekrutacyjne”
i wiele, wiele wiecej!