Jak programować obiektowo? cz.1 – wstęp

Kiedy zaczynałem swoją przygodę z programowaniem obiektowym szybko trafiłem na tutoriale i wszelkiego rodzaju inne kursy, które pokazywały jak wykorzystywać struktury obiektowe w kodzie. Niestety większość z nich demonstrowało jedynie, jak napisać swoją pierwszą klasę, interfejs, czy też stworzyć obiekt. Wszystko sprowadzało się do „gramatyki” języka, czyli słów kluczy, sposobu tworzenia tych struktur, itp. Gdzieś po drodze „gubiła się” jednak informacja skąd takie, a nie inne decyzje, dlaczego np. interfejs ma same metody abstrakcyjne? Do tego publiczne? Po co te widoczności? I tak dalej.

Dlatego też postaram się oderwać Was trochę od kodu (choć oczywiście postaram się o wystarczającą ilość odpowiednich przykładów), a postaram się skupić na tym, co jest najistotniejsze – na obiektowym myśleniu. Bo wbrew temu co można sądzić, wszystko na co możecie sobie pozwolić i czego Wam nie wolno pisząc obiektowo, ma swoje uzasadnienie.

To, jak implementujecie obiektowe rozwiązania w danym języku, jest czymś zmiennym, stałe pozostają wybierane rozwiązania, sposób rozumowania, proces podejmowania decyzji. Nie ważne, czy piszesz kod w PHP, Javie, C++ itp., ponieważ, jeżeli potrafisz go poprawnie zaprojektować, to ten projekt będzie uniwersalny, zmieni się jedynie sposób przetłumaczenia go na język zrozumiały dla interpretera/kompilatora danego języka.

Dobra, ale żeby nie przedłużać już i tak wystarczająco długiego wstępu, przejdźmy do rzeczy. Dzisiaj będzie trochę podstaw. Od czegoś w końcu trzeba zacząć.

Programowanie obiektowe – co to jest?

Programowanie obiektowe jest próbą przedstawienia świata rzeczywistego i relacji w nim zachodzących, za pomocą obiektów. Najważniejszymi cechami programowania obiektowego są:

  • Abstrakcja
  • Enkapsulacja
  • Dziedziczenie
  • Polimorfizm

Wszystkimi tymi pojęciami zajmiemy się w kolejnych wpisach. Dzisiaj skupimy się przede wszystkim na języku i na rzeczach, które są niezbędne do rozpoczęcia zabawy z OOP.

Klasa

Klasa, z punktu widzenia programowania, jest to typ zmiennej. Natomiast w ujęciu projektowym jest to ogólna definicja pewnej grupy powiązanych ze sobą obiektów, które różnią się tożsamością. Klasa definiuje metody, czyli funkcjonalność, które są dostarczane przez obiekty. Poza tym definiuje również atrybuty, które są indywidualne (nie zawsze, ale do tego tematu wrócimy w przyszłości) dla konkretnych obiektów. Czym jest obiekt? Jest to instancja danej klasy, czyli konkretna zmienna danego typu.

Prosty przykład dla rozjaśnienia sprawy:

Janek, Ania, Zosia to obiekty klasy Człowiek. Każde z nich może spać, jeść, poruszać się i to są właśnie metody zdefiniowane w klasie Człowiek. Oprócz tego każdy człowiek posiada imię oraz datę urodzenia, jednak są one indywidualne dla każdego obiektu, czyli nie są bezpośrednio powiązane z klasą, a z jej instancją (obiektem).

A jak coś takiego wyrazić za pomocą kodu?

Abstrakcja i dziedziczenie

Klasa abstrakcyjna różni się od zwykłej klasy tym, że nie można utworzyć jej instancji. Może dostarczać zarówno metody zdefiniowane jak i abstrakcyjne, czyli takie, które zostały zadeklarowane i muszą zostać zdefiniowane w klasach potomnych.

Dodajmy coś więcej do przykładu z wcześniejszego akapitu:

Oczywiście Janek, Ania, Zosia to obiekty klasy Człowiek. Niemniej jednak, oprócz tego wszyscy są ssakami, tak jak Pies Janka – Reksio.

Z powyższego wyłania nam się następujący kod:

Dlaczego Mammal jest klasą abstrakcyjną? Ponieważ pomimo tego, że ssakiem jest zarówno pies jak i człowiek, to nie jesteśmy w stanie utworzyć ssaka (nie urodzi się taki), który nie będzie przynależał do jakiegoś konkretnego gatunku. Nie zmienia to jednak faktu, że chcemy tą wiedzę (o tym, co ssakiem jest) posiadać.

Interfejs i realizacja

Specyficzną formą abstrakcji jest interfejs. Od klasy abstrakcyjnej odróżniają go dwie podstawowe rzeczy:

  • nie może definiować żadnych atrybutów, jedynie metody i stałe
  • wszystkie metody muszą być abstrakcyjne i publiczne

Interfejsy służą do zapewnienia pewnej pożądanej funkcjonalności, są pewnego rodzaju kontraktem pomiędzy klasami, które interfejs wykorzystują, a tymi, które go implementują. Interfejsy są po to, aby zagwarantować nam, że jakaś metoda istnieje, a nie jak się zachowuje.

I wracając do naszych przyjaciół ze wcześniejszych przykładów:

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.

I tak rodzi nam się kod przedstawiony poniżej:

Jeżeli chcielibyście sie dowiedzieć więcej o różnicach pomiędzy interfejsem, a klasą abstrakcyjną to zapraszam tutaj.

Czy to wszystko?

To, co napisałem dzisiaj jest jedynie wstępem i miało na celu wprowadzenie Was do tematu. Jest jeszcze wiele kwestii przed nami, które warto poruszyć, więc uzbrójcie się w cierpliwość – stopniowo przebrniemy przez wszystkie.

PS. Seria o tym samym tytule pojawiła się również u mnie na blogu kilka lat temu. Niemniej jednak, dzięki możliwości opublikowania jej tutaj, mam sposobność skonfrontowania tego, co napisałem wtedy, z tym, co wiem teraz. Dlatego też z pewnością tutaj pojawi się ulepszona i przeredagowana jej wersja.

Pozostałe artykuły z cyklu

Jestem fanatykiem obiektowego programowania i nieustannie pogłębiam swoją wiedzę we wszelkich tematach z nim związanych. Wszystko czego się dowiem konfrontuję z rzeczywistością, ponieważ teoria, która nie ma odzwierciedlenia w praktyce, traci swój sens tam, gdzie zaczyna się praca programisty :)

  • Co to znaczy programować obiektowo? Może chodzi Ci o programowanie zorientowane obiektowo?

    • Marcin Bazanowski

      Kochamy czepiać się definicji… Wiadomo o co chodzi. Nie od dzisiaj używa się tego skrótu myślowego gdy mówi się o OOP.

      • Dzięki za wyjaśnienie, aczkolwiek to raczej błąd tłumaczeniu EN -> PL niż skrót myślowy.

        • Maciej Płocki

          Jak przetłumaczysz ‚webmastah’? 😉

          • A jaki sens to tłumaczyć:) ? To nazwa własna nie termin…

          • programista

            O widzę świeżo upieczony programista i czepia się słówek, no patrzcie 🙂

          • Patryk

            Dziwny trend opisywanie jednoosobowej działalności gospodarczej w liczbie mnogiej.

          • A skąd wiesz, że nie pracuję z tatą lub mama lub z kimś zatrudnionym na zlecenie 🙂 ?

          • jpacanowski

            Nie trend. Brzmi bardziej profesjonalnie i zwiększa wiarygodność.

          • Faktycznie mam wrodzone czepianie się, zwłaszcza uzasadnione. No i nie taki znowu świeżak ze mnie 🙂

  • Adam Dziendziel

    Niby tego typu tekstów po internetach jest masa, ale fajnie, że opublikowaliście to na tym serwisie, bo to w jakimś stopniu gwarantuje jakość i poziom merytoryczny. A że podstawy dalej są potrzebne widzę po osobach rzeźbiących w drupalu 🙂

  • satyr

    No na razie to wprowadzenie nie rozni sie niczym od innych wprowadzen w necie. Zgadzam sie z teza, ze tutoriale powinny oprocz tego „jak”, tlumaczyc jeszcze „po co” programowac obiektowo. Z ta teza spodziewalem sie wiekszej ilosci przykladow z zycia wzietych. Tymczasem klasyk w postaci obiektow z ludzmi (popularne sa jeszcze samochody). Czekam na dalsze czesci z prawdziwymi i powaznymi przykladami z rozbudowanych projektow. Ciesze sie ze autorowi chce sie pisac, zycze aby nie znudzilo sie po 3 artykule:)

    • Krzysztof Wolniak

      Ludzie, maszyny i figury 😉

  • Gall

    Brakuje mi tylko jednego na razie – wyjaśnienia składni języka. Pokazanie gotowego kodu nie jest wystarczające, a w żadnym z poradników na jakie się natknąłem nikt nie wyjaśnia składni.

    • Od składni jest dokumentacja, ale z dokumentacji z kolei nie nauczysz się dobrych praktyk. Dlatego czekam na kolejną część. 🙂

  • Wojtek

    Co to jest?

    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15interface Animal
    {
    public function eat() {/*…*/}
    public function move() {/*…*/}
    }

    • Sebastian Malaca

      Poprawione. Dzięki za czujność 🙂

  • jim1961

    Myślałem, że jestem newbie, co „rzeźbi” strony na Drupalu (jak tu ktoś wspominał), więc pytam co to ma być ?? [code] interface Animal {
    public function eat() {/*…*/}
    public function move() {/*…*/}
    }[/code]

    IMHO to już są implementacje metod, której tam (w interfejsie) nie powinno być? Podziękuję za resztę takiego kursu.

    • Masz na myśli wielokropek w bloku komentarzy między klamrami?

      • satyr

        Po definicji metody w interfejsie stawia się średnik, a nie rozpoczyna ciało funkcji. Dopiero to zauważyłem. Mam nadzieję, że autor wstawił to z rozpędu, bo jeśli faktycznie tak ma wyglądać reszta kursu to lepiej się wstrzymać z pisaniem i czytaniem:)

        • Na bank „z rozpędu” 😉 Też „z rozpędu” przeoczyłem :p

          • Sebastian Malaca

            Tak to właśnie bywa, kiedy artykuł został napisany, a autor pali się do publikacji – rodzą się głupie błędy 🙁
            Postaram się w przyszłości ich unikać.

    • Sebastian Malaca

      Nie mam usprawiedliwienia dla siebie i zgadzam się, że takie błędy nie powinny się pojawiać. Postaram się, żeby w przyszłości takich wpadek nie było… a jeżeli się zdarzą, to przynajmniej mam już pewność, że długo nie pozostaną niezauważone i niewiele osób przeze nie zostanie wprowadzonych w błąd 🙂

      Dzięki za czujność.

  • Zabrakło mi na początku kaczek, ale ludzie też mogą być 😉 Dobrze, że taki tekst się ukazał na Webmastah. Nie mogę doczekać się kolejnych części, więc już teraz zaglądam na bloga…

    • Guest

      Myślałem o kaczkach

    • Sebastian Malaca

      Kaczki były drugie w kolejce 🙂

  • Patryk

    Zastanawiam się ostatnio do jakich odbiorców chce dotrzeć webmastah ?
    Jestem wiernym fanem od czasu zielonego forum, które pomogło mi w uporaniu się z nurtującymi mnie problemami z kohaną.
    Pomijając formę informacyjną, dalej nie wiem jaki jest plan na serwis.
    Pomysł o opisaniu OOP wydawał mi się strzałem w dziesiątkę. Czytając komentarze odniosiłem często wrażenie, że jest mocna ekipa co OOP i resztę kosmicznych technologi ma w jednym palcu.
    Mam duży niedosyt i delikatne zniesmaczenie jakością tekstów ostatnio. Trochę łudziłem się, że biedzie to miejsce gdzie społeczność w rodzimym języku będzie rozmawiała, tłumaczyła, przytaczała przykłady, dotyczące programowania.
    Liczę na to, że autor w następnym wpisie, pozamiata.

    • Potfur

      Zacznij więc pytać na forum.

    • nrm

      a nie rozmawia, przytacza, tłumaczy? Bo w sumie nie do końca załapałem gdzie problem. Że za dużo dla początkujących? No tego nie przeskoczysz, TRZEBA.

  • piotrooo

    Pisanie tekstów o psach, kotach, ssakach lub wielorybach w kontekście OOP to jakaś porażka – jakbym miał flashbacka z uczelni. Ten tekst nic nie wnosi w „internety” ponieważ jest ich pietryliard po angielsku, polsku, chińsku i w dolnym narzeczu suahili.

    Sorry za taki hejt no ale niestety tak jest. Dlaczego uznawać odbiorców za kompletnych debili, którzy nie są w stanie zrozumieć przykładu z życia wziętego. Trzeba na siłę wpychać zwierzęta bo przecież wszyscy piszą aplikacje do ZOO. Wylewam trochę tutaj frustrację, bo chcę traktować ten portal jako zbiór artykułów, które są warte więcej niż przysłowiowy funt kłaków.

    • Sebastian Malaca

      Co do przykładów, to już dostałem kilka sugestii i postaram się, aby w następnych częściach serii były bardziej „życiowe”.

      Co do odbiorców, to wcale nie mam na celu nikogo traktować tak, jak napisałeś. Chodzi o to, że chcę zacząć od początku, co niestety wymaga poruszenia kwestii, które dla niektórych są oczywiste.
      Mam nadzieję, że w kolejnych częściach, również i w Twoim odczuciu, uda mi się coś „wnieść w internety” 🙂

    • Marek Bednarczuk

      Nie każdy kto koduje był na uczelni to raz. Dwa, mimo uczelni to nie każdy miał na niej programowanie czy nawet informatyke np. MiT (Muzyka i Taniec). Ja jestem po wydziale elektrycznym. Programowanie to miałem ale procków w ASM. PHP uczę się sam, więc każda porcja, nawet powtórzeniowa jest dla mnie kawałkiem wiedzy.

      • piotrooo

        Więc ktoś kto studiował informatykę (ja) mówię, że uczenie się na takich przykładach nie jest tyle nie rozwojowe co wręcz uwsteczniające, bo nie uczysz się modelować czegoś rzeczywistego tylko wyssane z palca przykłady.

        Masz do wyboru przykład z sensem lub śmiecenie sobie głowy ssakami – wybór oczywisty.

        • Marek Bednarczuk

          Nie do końca. Czym różni się przykład z ssakami (znanymi nam od dziecka) od przykładu z wymyślnymi rzeczami typu produkty w sklepie, kategorie czy posty na forum? Dla mnie ssaki są bardziej obrazowe. To mogą czytać ludzie zaczynający z OOP i nie mający na koncie napisania forum, sklepu czy nawet plugina do WP.

        • Sebastian Malaca

          I to jest właśnie problem przy wyborze przykładów. Z jednej strony są ludzie, którzy chcieliby poczytać coś w oparciu o przykłady np. budowania raportów, eksportowania ich, etc., a z drugiej są ludzie, którzy jeszcze takich problemów nie znają, bo dopiero zaczynają.
          Zwróć uwagę, że zaczynam od podstaw – w założeniu nie potrzebna Ci jest żadna wiedza początkowa. Jeżeli świetnie poruszasz się w świecie interfejsów i klas, to może natrafisz na coś nowego, a może nie, ale z pewnością większość rzeczy będzie już dla Ciebie wiadoma.

          Jeżeli przykład oparłbym na np. mechanizmie importowania danych z Active Directory, do tego wykorzystując klasy z Zend’a, to koncepcja, która miała być przedstawiona jest odsuwana na dalszy plan, bo trzeba się przegryźć przez API klas Zenda + dowiedzieć się co to i jak działa AD. „A miała być jedynie demonstracja ogólnej ideii stojącej za interfejsem” 🙂

          Przykłady muszą być na tyle proste, żeby na pierwszy rzut oka było wiadomo do jakiego tematu zostały stworzone, jaką koncepcję mają pomóc zrozumieć.
          Nie zmienia to jednak tego, że postaram się unikać tak oderwanych od naszych powszednich problemów przykładów 🙂

    • Pioter

      Dokładnie, tym bardziej, że przykład ssaków w ogóle nie obrazuje idei programowania obiektowego… jeżeli ktoś wchodzi w programowanie obiektowe, to jakieś podstawy na pewno zna, dlatego chyba lepiej jest to przedstawić np. na formie modelu
      model users -> metody dodawanie, usuwanie, edycja itd itp

      Chodzi o to, aby konkretnie zobrazować problem… równie dobrze, można nauczyć kogoś jeździć samochodem na zasadzie kierownicy z opakowania po masle

      • Sebastian Malaca

        Dobra, zrozumiałem, żeby na przyszłość postarać się o bardziej „programistyczne” przykłady.
        Niemniej jednak nie rozumiem dlaczego przykład nie obrazuje OOP? Co jest złego? Klasy zostały wykorzystane tam, gdzie powinny zostać wykorzystane, to samo z klasą abstrakcyjną i interfejsem. Chyba, że czegoś nie zauważam? Jeżeli są jakieś błedy w myśleniu, to chętnie sprostuję. Czy może chodzi jedynie o wykorzystanie takich, a nie innych encji?

        Jeżeli mógłbyś mi wytłumaczyć jeszcze skąd takie porównanie to również będę wdzięczny, bo ja niestety nie zauważam analogii.

        Zdaję sobie sprawę, że niektórzy chcieliby zobaczyć jakieś CRUD’y, operacje na bazie, autoryzacje, notyfikacje itp., ale prawdę mówiąc OOP wykorzystujemy do zobrazowania rzeczywistego świata zachowując relacje i zależności i odwzorowując to w taki sposób, abyśmy my (programiści) bez problemu mogli dogadać się z klientem, więc nie wiem gdzie leży błąd?
        W przykładzie mamy konkretną domenę, może niecodzienną, ale jak najbardziej prawdopodobną np. specjalistyczny system katalogowania.

        Co do znajomości podstaw, to cóż… celem serii jest przejście przez podstawy i przedstawienie powodów dlaczego takie a nie inne rozwiązania zostały w OOP zastosowany. Umiejętność stworzenia klasy czy interfejsu to nie podstawy, to nawet nie jest wstęp do OOP.
        Nie jest istotne „jak” tylko „dlaczego” i „po co”.

  • Dariusz Wójcicki

    Przeczytałem artykuł oraz komentarze. Jeśli o mnie chodzi to przytoczony przykład z ludźmi, ssakami itd. jest jak najbardziej ok. Pomaga zrozumieć ideę 😉

  • Jawl

    Czy na części 1 się skończyło czy planowane jest wydawanie co pół roku?

    • Sebastian Malaca

      Jest już część druga i trzecia, które możesz przeczytać na stronie, a czwarta ma się na ukończeniu 🙂

      • Jawl

        Dzięki za te artykuły.
        Teraz jak patrzę na ten komentarz to widzę, że zareagowałem jak hejter. Ale to była prowokacja bo często ludzie coś zaczynają, i na tym się kończy. Czy część 4 została wydana? Ponieważ nie mogę nigdzie jej znaleźć w tym serwisie.

        • Sebastian Malaca

          Nie ma sprawy 🙂 Tym bardziej, że wydanie artykułu numer 4 się przeciągnęło (jak widać całkiem sporo).
          Powinien ukazać się do końca przyszłego tygodnia, a kolejne w odstępach ok. dwu tygodniowych.
          Ze swojej strony przepraszam za taki przestój. Mam również nadzieję, że kolejne będą równie pomocne 🙂

  • Fajny cykl. W sumie racja. Wiele osób zna syntaktykę i semantykę, ale nie zna wzorców projektowych 🙂

Send this to friend

webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL
webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL