środa, 18 marca 2015

Filary programowania obiektowego - Polimorfizm

Początek

Zawsze musi być jakiś początek. Gdy chcemy zacząć przygodę z programowaniem obiektowym warto poznać pewne podstawowe pojęcia, nazwijmy je tutaj filarami. W kolejnych postach postaram się opisać każdy z nich.


Filary programowania obiektowego

  1. Polimorfizm
  2. Hermetyzacja
  3. Dziedziczenie

W liceum nauczyłem się programować w języku Turbo Pascal. W mojej  głowie nie istniały wówczas pojęcia "paradygmatu", "obiektowości", "programowania strukturalnego", a programowanie rozumiałem jako lista instrukcji wydana magicznemu interpreterowi, który zamieniał je w funkcjonujący byt.

Próbując poznać sekrety programowania obiektowego jednym z pierwszych pojęć był polimorfizm. Ten pochodzący z greki wyraz skrywał w sobie wówczas wiele tajemnic. Samo pojęcie polimorfizmu używane jest przez wiele nauk.


Polimorfizm w kontekście

Polimorfizm to mechanizm, który pozwala obiektom danego typu zachowywać się różnie, adekwatnie do implementacji.

A może konkretniej? 

Ludzkie zachowanie może być rozumiane jako polimorficzne. Przykładem jest np. jedzenie.Załóżmy, że typem jest Człowiek. Konkretną implementacją abstrakcji jaką jest Człowiek niech będzie konkretna osoba, np. Jan Kowalski (konkretna osoba). Drugą implementacją człowieka niech będzie mieszkający w Chinach Ju Li Wang.

Człowiek człowiek1 = new Polak("Jan Kowalski")

Człowiek człowiek2 = new Chińczyk("Ju Li Wang")
 

Polimorficzne wywołanie

Polimorficznym wywołaniem nazywamy wywołanie metody danego obiektu na konkretnej jego implementacji. Obiekt zachowa się wówczas adekwatnie do swojej implementacji.

Załóżmy, że Człowiek definiuje metodę 'jedz()'.

człowiek1.jedz()
człowiek2.jedz()

Zauważmy, że każdy z obiektów zdefiniowany jest jako typ 'Człowiek' i jest osiągalny przez referencję tego typu. Tutaj dochodzimy do warunku wywołania polimorficznego. 

Warunek polimorfizmu

Polimorficzne zachowanie obiektu będzie możliwe tylko wtedy gdy odwołujemy się do niego za pomocą wskaźnika/referencji.

Polimorfizm pozwoli tutaj każdemu z obiektów zachować się zgodnie ze swoją implementacją.
Polak zje danie nożem i widelcem, a Chińczyk używając pałeczek, tak jak został nauczony i tak jak potrafi (bardziej abstrakcyjnie - obiekt zachowa się tak jak został zaprogramowany)

Polimorfizm sam w sobie jest cechą. Cechą, którą mają wszystkie obiekty (w programowaniu obiektowym) i wcale nie jest taki straszny na jaki brzmi i jak go malują. Pozwala pisanym programom być w łatwy sposób rozszerzalnymi, poprzez dopisywanie nowych implementacji w nowych klasach a w połączeniu z dziedziczeniem daje wprost mieszankę wyjątkową ale o tym w następnym poście.


piątek, 13 marca 2015

Pierwszy post!

To jest pierwszy post na moim blogu

Witam wszystkich entuzjastów programowania. Na moim blogu postaram się nieco przybliżyć zagadnienia związane z programowaniem obiektowym oraz funkcjonalnym. Będę również poruszać tematy związane z programowaniem w konkretnych językach min. JAVA, Scala.

Na początek kilka słów jak zaczęła się moja przygoda z programowaniem.

Nieświadomy początek

Swoją przygodę z programowaniem zaczynałem na przełomie gimnazjum i liceum. W tych latach premierę swoją miała gra Neverwinter Nights. Razem z moim siostrzeńcem spędzaliśmy bardzo dużo czasu przed ekranem komputera - co przełożyło się na mój wzrok (po minus jednej dioptrii na każdym oku) - nie widzieć czemu - oczy siostrzeńca nie ucierpiały wcale.

Po wielu godzinach spędzonych na walce z potworami i zdobywaniu punktów doświadczenia dobrnęliśmy do końca rozgrywki. Dopadło mnie wtedy uczucie pustki i braku celu. Odkryłem wtedy moduł do tworzenia własnych plansz i questów. Kolejne godziny mijały mi na tworzeniu rozległych lokacji. Najciekawsze rzeczy jednak dotyczyły możliwości oskryptowania akcji, wykorzystywania czarów zdefiniowanych w grze oraz wprowadzania interakcji gracz/NPC i gracz/środowisko.

Opierając się na bardzo nielicznych przykładach z internetu, do którego jeszcze wtedy łączyliśmy za pomocą antycznego już numeru 0202122 i magicznych credentiali ppp/ppp, tworzyliśmy swoje pierwsze skrypty, a czasami całe programy niekiedy sięgające setek linii kodu. Co najdziwniejsze, tworzyliśmy to jedynie na podstawie przykładów i metod prób/błędów nie mając jakiegokolwiek pojęcie o programowaniu.

Po latach z łezką nostalgii wspominam te niewinne czasy, gdy nie miało się świadomości z tego że używa się C++. Umysł wolny był wtedy od matematycznych podstaw programowania, czy jakichkolwiek tzw. "dobrych praktyk". Tworzyło się rzeczy tak aby działały, często spędzając wiele godzin na uzyskaniu zamierzonego efektu. Jak mawiają miłe złego początki, a te początki rzeczywiście dostarczyły mi wiele radości i satysfakcji że udawało się coś doprowadzić do działania.

Duch niepokorny



Czasem warto iść pod prąd. Na IV-tym roku studiów wyjechałem na wymianę studencką do Finlandii gdzie zapisałem się na kurs Javy i od tamtej pory już się nie rozstaliśmy. Po powrocie do Polski już wiedziałem co chcę w życiu robić. Całą energię poświęciłem na to by kończąc studia mieć na tyle wiedzy by zostać programistą. Bardzo cieszyłem się z tego, że kolejny raz ciężka praca dała swoje efekty i do dzisiaj mogę realizować swoje marzenia.