Menu Zamknij

Czy na pewno Programujesz Obiektowo w Javie?

Jeżeli myślisz, że programujesz obiektowo, tylko dlatego, że piszesz w Javie – to się grubo mylisz. Być może oszukujesz siebie, a co więcej też swojego pracodawcę. Jest nawet taka możliwość, że po prostu minąłeś się z powołaniem i zamiast w Javie powinieneś programować w Turbo Pascalu. Tworzenie metod i upychanie je w osobnych plikach, które nazywasz klasami, nie jest programowaniem obiektowym. Co więcej, większość jak ty to mówisz „obiektów”, może wcale nimi nie być.

Programowanie obiektowe w Java

Jeżeli czujesz, że może to dotyczyć ciebie, to się jeszcze nie załamuj. Ten wpis jest po to, by zwiększyć twoją świadomość i zmienić twoje spojrzenie na niektóre kwestie. Programowanie obiektowe to coś o wiele więcej! Jeżeli chcesz w pełni wykorzystać to narzędzie, musisz je lepiej poznać i zmienić nieco swoją percepcję.

No to co … Zaczynamy?

Programowanie obiektowe jest nieintuicyjne dla naszych mózgów

Naprawdę ciężko w codziennym życiu znaleźć prawdziwe przejawy obiektowości. Wydawałoby się, że z każdej strony otaczają nas jakieś obiekty. Może i to prawda, ale w większości spraw myślimy procedurami. Ludzie w codziennych sprawach myślą w prosty sposób – Krok po kroku do celu. Każdy z nas na pewno czytał kiedyś jakiś przepis na ciasto. To tylko spis składników i lista kroków do wykonania. Tak proste podejście, sprawdzało się od wieków. Prawdopodobnie ludzie tworzyli procedury i rozwiązywali przy ich pomocy problemy na długo przed pojawieniem się komputerów. Co więcej, robią to do dzisiaj.

Każdy z nas to lubi – Proste działania, krok po kroku, które prowadzą nas do oczekiwanych rezultatów. Nawet dzieci, które uczą się programowania, zaczynają właśnie od podejścia proceduralnego. Podejrzewam, że to nie jest przypadek. Myślę bowiem, że działanie proceduralne jest dla nas najbardziej intuicyjne i siedzi w nas naprawdę głęboko. Więc też bardzo trudno jest się powstrzymać od takiego myślenia i zacząć programować naprawdę obiektowo.

Programowanie proceduralne

Wiedząc, że programowanie obiektowe, nie jest tak intuicyjne, nie możemy już w pełni ufać swoim pierwszym odruchom. Te zazwyczaj będą prowadzić cię w kierunku podejścia proceduralnego. Więc pamiętaj, musisz sam się przypilnować. Zawsze po zrobieniu większego kawałka kodu, zatrzymaj się, popatrz z trochę innej perspektywy i sprawdź, czy na pewno programujesz obiektowo.

Złożoność problemów już nas nie przytłacza

Ludzie szybko zorientowali się, że proceduralny sposób na rozwiązywanie problemów bywa niewystarczający. W zderzeniu z tematami o dużej złożoności potrzebne było nowe narzędzie. To narzędzie to programowanie obiektowe. To dawało nam coś, przy czym problemy ze złożonością bladną. To niespotykane dotąd możliwości posługiwania się abstrakcją.

W obiektowych językach programowania prawie każdy problem można ubrać w zrozumiałą dla człowieka, prostą abstrakcję. To pozwala w sprytny sposób dzielić skomplikowane problemy na mniejsze i mniejsze – Od ogółu, do szczegółu. To jest ta prawdziwa moc programowania obiektowego. To tu jest dźwignia, jeżeli chodzi o szybkość wytwarzania nowych funkcjonalności. Również czytelność i rozumienie kodu nie są już takim problemem, gdy abstrakcja jest dobrze wyważona.

Skuteczne posługiwanie się abstrakcją wymaga jednak pewnych umiejętności. Do tego potrzeba już trochę wyobraźni i oczywiście zdolności abstrakcyjnego myślenia. Ważne jest, by abstrakcje były użyteczne i nie stały się zbyt ogólne. Z drugiej strony należy pamiętać, że nadmiar szczegółów nas po prostu przytłoczy.

Programowanie obiektowe w Java

Jak myśleć w kategoriach obiektów?

Programowanie obiektowe jak sama nazwa mówi, skupia uwagę na obiektach. Prawdziwy obiekt to coś, co ma wiedzę i umiejętności. Jest za coś odpowiedzialne. Potrafi poradzić sobie z niektórymi problemami bez pomocy klienta. Odbiera i przetwarza informacje w swój własny sposób, na bazie swojej wiedzy i umiejętności.

Traktuj obiekty jak coś żywego. Jak dobrego pracownika, który wykona zadanie. Zrobi je pomimo braku dokładnej instrukcji. Sam dogada się ze swoimi współpracownikami. Dostarczy wyniki i jak trzeba, to nawet posprząta po sobie.

Ciężko nazwać obiektem coś, co składa się tylko z prywatnych pól, oraz publicznych getterów i setterów . Coś takiego zdecydowanie przypomina strukturę danych podobną do tablicy lub mapy. To prawda, że struktury danych mogą być czasem potrzebne. Jednak robienie wszystkich „obiektów” w ten sposób to prosta droga do programowania proceduralnego. Wtedy twój kod wygląda mniej więcej tak jak w poniższym przykładzie.

StupidObject myStupidObject = veryImportantObject.getSomething();
String someValue = myStupidObject.getSomeValue();
otherStupidObject.setSomeValue(someValue);
myStupidObject.setOtherValue(someValue*2);
veryImportantObject.setSomething(myStupidObject);

Trochę abstrakcji i szczypta hermetyzacji, a kod wygląda już dużo lepiej.

MyCleverObject myCleverObject= new MyCleverObject(helper, knowlage);
myCleverObject.doSomething();

Dobry obiekt nie może udostępniać wszystkim swoich danych. Te dane są jego integralną częścią, która definiuje jego tożsamość, nikt nie powinien tego ruszać. Powinien udostępniać jedynie swoje zachowania w postaci publicznych metod. Gdyby taki obiekt mógł mówić, na pewno powiedziałby coś w tym stylu.

  • Nie interesuj się moimi danymi!
  • To moja sprawa jak rozprawię się z twoim problemem!
  • Ty drogi kliencie powiedz mi tylko, co cię boli, a ja się tym zajmę.

Zmierzaj od ogółu do szczegółu

Nie skupiaj się od razu na szczegółach. Skup się na tym, co ten kod ma dostarczyć, jaka to funkcjonalność, jakie są cele do zrealizowania. Zmierzaj od ogółu do szczegółu. Jeżeli w procesie projektowania pójdziesz zbyt głęboko, szczegóły zaburzą twoją perspektywę.

Zacznij od zastanowienia się, czego oczekuje klient twojego API. Szczegóły ukrywaj, niech nie zaburzają oglądu sprawy.

Obiekty działają na różnych poziomach abstrakcji. Na każdym poziomie mogą operować trochę innymi pojęciami. Te na wyższym poziomie powinny delegować zadania do coraz to bardziej wyspecjalizowanych obiektów. Dobrze zaprojektowana aplikacja powinna przypominać raczej dobrze zorganizowaną firmę, niż monotonną linię produkcyjną.

Ważną kwestią są też argumenty metod publicznych. Upewnij się, że pasują do twojej abstrakcji. Argumenty, które uderzają mocno w szczegóły implementacji mogą okazać się tu nadmiarowe z punktu widzenia klienta metody. Jeżeli tak jest to być może wartości te powinny być integralną częścią obiektu już od momentu jego powstania. Argumenty powinny raczej określać problem do rozwiązania, nie zaś samo rozwiązanie.

Przejdź na jasną stronę mocy

Zaprzyjaźnij się z programowaniem obiektowym. Poznaj lepiej jego fundamenty. Abstrakcja, hermetyzacja, dziedziczenie i polimorfizm zostały wymyślone, by ułatwić życie właśnie tobie. Dobrze napisany kod w obiektowym języku programowania, jest bardziej czytelny, prostszy w rozbudowie i gotowy na zmiany.

Jak przy rozpoczęciu prac nad wprowadzeniem nowej funkcjonalności, myślisz o bazie danych, to coś jest nie tak. Każdy z nas już przerabiał ten scenariusz. Projektujesz model bazy danych. Tworzysz anemiczne encje z geterami i setterami. Teraz trochę proceduralnego kodu – set set, get get. Pewnie jakieś API w stylu CRUD i katastrofa gotowa. Znów tworzysz same procedury i struktury, a później narzekasz, że nie idzie tego ogarnąć. Nie tędy droga.

  • Przestań tworzyć struktury! Zacznij tworzyć obiekty!

Nadmierna ilość struktur oraz proceduralnego kodu powoduje ogromne trudności w jego rozumieniu i późniejszej rozbudowie. Wiadomo w każdej aplikacji napisanej w Javie, będzie trochę takiego kodu. Staraj się ograniczać to zjawisko, a już na pewno bądź świadomy.

Programowanie obiektowe

Obiektowe języki programowania są z nami od lat. Niestety ideały, które przyświecały przy ich powstawaniu, zostały gdzieś zatracone. Od samego początku w aplikacjach pojawiały się całe rzeki proceduralnego kodu pełne instrukcji warunkowych i pętli, na których nie jeden miał ochotę się powiesić. Ludzie, którzy przeglądają coś takiego, odczuwają ból, niedowierzanie, zagubienie i chaos.

  • Czas przestać krzywdzić ludzi! Czas zacząć programować obiektowo!

Mam nadzieję, że ten wpis ci się spodobał. Lajkujcie, hejtujcie, komentujcie, udostępniajcie!

Please follow and like us:
Skuteczna refaktoryzacja w 10 krokach!

Odbierz Darmowy Poradnik o Refaktoryzacji!

Poznaj kilka prostych technik i wprowadź nową jakość w swoim projekcie.

Dzięki za dołączenie do mojej listy.

Coś poszło nie tak :( Spróbuj jeszcze raz.