Java. Programowanie obiektowe
Java. Programowanie obiektowe
Programowanie obiektowe. Związek ze środowiskami graficznymi
Java programowanie obiektowe - strona g��wna Programowanie sterowane zdarzeniami Hermetyzacja Dziedziczenie Polimorfizm Inne publikacje Analiza portfelowa Projektowanie magazynów Stylystycznie blog Moda męska

Programowanie obiektowe robi karierę już od ponad 10 lat i na ten temat została napisana już niejedna książka. Powstało ono na bazie badań z zakresu psychologii, które dowodziły, że im większa liczba szczegółów jest prezentowana człowiekowi, tym trudniej jest mu się na nich skupić. A szczegóły nie zawsze są potrzebne do poprawnego wykorzystania przedmiotów, nawet bardzo mocno nimi nasyconych. Przykładem niech będzie telefon komórkowy. Mało kto wie, jak dokładnie działają wszystkie jego składowe, jak napisane są gry w języku Java oraz jak powstają elementy półprzewodnikowe, z których są one zbudowane. W zupełności nie przeszkadza to jednak milionom ludzi na całym świecie aktywnie korzystać z ich możliwości.

Programowanie obiektowe. Historia

W miarę rozwoju techniki komputerowej szybkość działania komputerów i ich potencjalne możliwości obliczeniowe stale rosły. Aby w pełni wykorzystać te możliwości (poza prostym wykorzystaniem starych programów, licząc jedynie na wzrost szybkości wynikający z lepszego sprzętu) należało coraz bardziej rozbudowywać programy działające na tych maszynach. W miarę wzrostu stopnia złożoności programów ich twórcy starali się wyodrębnić jak największą ich część w postaci niezależnych, gotowych do ponownego użycia procedur i bibliotek. Miało to zapewnić odejście od najstarszego modelu programowania, w którym każdy program zaczynało się zawsze tworzyć od początku. Jednak te pozornie rozłączne fragmenty często operowały na danych wspólnych dla siebie i innych procedur. Dwie procedury działań na macierzach często operowały na wskaźniku do tej samej macierzy, czyli tak naprawdę modyfikowały jednocześnie ten sam fragment pamięci. Aby zapobiec takim coraz częstszym pomyłkom, należało stworzyć taki model programowania, który zapewniłby bezpieczeństwo w tej kwestii. Druga przyczyna to zwiększenie zapotrzebowania na języki i środowiska symulacyjne. Wykorzystanie komputerów do analizy różnego typu skomplikowanych sytuacji pojawiło się dopiero w momencie, kiedy miały one właściwe możliwości technologiczne. Wraz z pojawieniem się tych możliwości należało przystosować języki programowania do takich potrzeb. Tak powstała Simula czy SmallTalk - pierwsze języki programowania mające wbudowane elementy obiektowości.

Programowanie obiektowe. Związek ze środowiskami graficznymi

Kolejnym i chyba najważniejszym czynnikiem rozwoju programowania obiektowego była popularność systemów operacyjnych pracujących w środowisku graficznym. Jakkolwiek pierwsze systemy graficzne (czy ktoś pamięta jeszcze na przykład GEM?) nie były tworzone i zorientowane obiektowo, naturalne i intuicyjne podejście do nich było jak najbardziej obiektowe. Przesuwanie, zmiana rozmiaru, koloru czy tytułu to typowe operacje charakterystyczne dla okna. Zawiera ono elementy danych, które nie muszą być udostępniane innym oknom. A więc natura takiego środowiska jest obiektowa. Prawdopodobnie to na potrzeby takich środowisk powstały pierwsze próby przekształcania języków proceduralnych (C, Pascal) w języki obiektowe (Objective-C, Eiffel czy Ada).

Java. Kolejny krok w programowanie obiektowe

Kolejną generację języków, które mocno popchnęły ideę programowania obiektowego do przodu, stworzyły Borland Pascal i C++. Mimo bazowania na językach strukturalnych oferowały zupełnie nową jakość tworzenia programów. Dzięki wielkiej popularności umożliwiły ewoluowanie standardu, co zaowocowało bardziej efektywnym i intuicyjnym sposobem programowania. Kiedy okazało się, że dalsze rozszerzanie i modyfikowanie idei obiektowej nie jest możliwe, powstała Java. Z języka C Java zaczerpnęła składnię, zaś z C++ - większość elementów związanych z obiektowością. Do Javy wprowadzono jednak szereg modyfikacji, mających na celu rozwiązanie problemów (zwłaszcza z bezpieczeństwem i przenośnościa kodu), których nie udało się rozwiązać w modyfikacji innych języków.

Autorami Javy są: James Gosling, Patrick Naughton, Chris Warth i Mike Sheridan, wszyscy z firmy Sun Microsystems (która ostatnio otworzyła kod Javy). Pierwsza wersja języka, która powstawała przed 1995 rokiem nosiła nazwę OAK. Dopiero w 1995 roku, gdy stała się bardziej stabilna, nazwano ten język Java. W okresie od 1991 - 1995 nad rozwojem języka pracowało oczywiście znacznie więcej osób, przy czym najczęściej wymienia się Arthura van Hoff, Billa Joy, Franka Yellin, Tima Lindholm i Jonathan Payne. Jednak jako niekwestionowanego ojca Javy uznaje się Jamesa Gosling'a.

Czy w obecnych czasach można powiedzieć, że są jeszcze osoby, które nie mają z Javą nic wspólnego? Raczej nie. Jeśli tylko ktoś korzysta z internetu, dowolnego komputera (również ukrytego pod postacią telefonu komórkowego), telewizji cyfrowej, kart bankomatowych czy innych chipowych urządzeń tak popularnych w nowoczesnej technologii to można powiedzieć, że jest zarażony Javą, choć wcale o tym nie wie. Po niemal 15 latach od oficjalnej premiery Java stała się wszechobecna, podobnie jak koło. Zresztą podobnie do niego Java sama w sobie nie ma szczególnie wielkiej wartości w porównaniu do innych języków programowania. Dopiero ludzie używający produktów stworzonych przy pomocy Javy i sami twórcy oprogramowania w tym języku nadają jej prawdziwej wielkości.

Zalety programowania obiektowego

Programowanie obiektowe to nie tylko moda. Posiada ono kilka cech, które umożliwiają bardzo efektywne i szybkie tworzenie programów. Cechy te uwidaczniają się tym bardziej, im więcej programów tworzymy. Posiadamy wtedy w swoich zasobach coraz więcej obiektów, które mogą być wykorzystane w dalszej pracy coraz niższym nakładem. Zaleta programowania obiektowego ujawnia się również w okresie konserwacji, rozbudowy oraz optymalizacji oprogramowania. Poszczególne elementy składowe można poprawiać bądź wymieniać przy bardzo niewielkim ryzyku utraty funkcjonalności czy błędów w działaniu poprawionego programu.

Poniżej przedstawiam zestawienie cech (oczywiście występujących w Javie), które powodują, iż posiadanie bogatej biblioteki obiektów znacznie przyspiesza (w porównaniu do biblioteki procedur) tworzenie nowych programów. W dalszej części tej strony przedstawię szersze przykłady pomagające w zrozumieniu znaczenia tych cech. Więcej przykładów zawiera moja książka, opisana dalej na tej stronie.

Hermetyzacja

Hermetyzacja to sposób odizolowania od otoczenia wybranych danych i funkcji (operujących na tych danych) zgromadzonych w jednej strukturze. Widoczne są tylko niezbędne fragmenty programu, natomiast zmienne i funkcje pomocnicze są ukryte i niedostępne z zewnątrz. Dzięki takiemu połączeniu programista uwalnia się od pamiętania o wszystkich szczegółach implementacyjnych, co zapewnia zmniejszenie liczby błędów oraz prostszą strukturę programu końcowego. Ukrywanie szczegółów zawiera moja książka w jednym z podrozdziałów. Dla terminu hermetyzacja spotyka się również określenie enkapsulacja. Podobnie jak w innych językach programowania, hermetyzację można stosować bez klasycznych mechanizmow programowani obiektowego.

Dziedziczenie

Dziedziczenie to operacja, która powoduje przeniesienie danych i metod z klasy bazowej do potomnej. Mechanizm ten uwalnia programistę od ponownego tworzenia i implementowania struktur danych oraz funkcji działających na tych strukturach. Udostępnia on możliwość korzystania z własnej bądź cudzej pracy jedynie poprzez rozszerzanie już zaimplementowanych elementów. Nie ma więc konieczności ponownego definiowania tego, co raz już zostało zrobione. Zyski z dziedziczenia przedstawiłem na przykładzie, który zawiera też moja książka. Warto pamiętać, że dziedziczenie może dotyczyć również interfejsów, gdzie trzaba zachować większą ostrzność w stosowaniu tego mechanizmu.

Polimorfizm

Polimorfizm to najważniejsza cecha, która umożliwia dostosowanie działania obiektów do własnych oczekiwań poprzez łączenie funkcjonalności zarówno dziedziczonej, jak i implementowanej samodzielnie. Idea polimorfizmu bazuje na tym, że użytkownik obiektu nie wie i nie musi wiedzieć, czy konkretne zachowanie wykorzystywanego obiektu zostało zrealizowane bezpośrednio w tym obiekcie czy też w tym, po którym dziedziczy on swoje właściwości. Ponadto może się okazać (i często tak się dzieje), że takie samo odwołanie do metody za każdym razem dotyczy innej akcji (inaczej zdefiniowanej). Może się też okazać, że w zależności od poziomu dziedziczenia pozornie ta sama metoda (nazywająca się tak samo) wykonuje inną akcję (tak jak pokazałem to we fragmencie swojej książki). Inny efekt polimorfizmu widać w przypadku kolejności inicjacji klas). Używanie pól klasy zawierającej może wprowadzić do konieczności rozszerzenia wiedzy na temat polimorfizmu w porównaniu do przypadku, gdy klasa wewnętrzna dziedziczy po tak zwanej normalnej klasie.

Programowanie sterowane zdarzeniami

Programowanie sterowane zdarzeniami jest metodologią tworzenia programów, określającą sposób przekazywania sterowania między podszczególnymi modułami tej samej aplikacji (bądź między różnymi aplikacjami). Rozwiązanie to stosuje się w środowiskach wieloprocesowych i pseudowieloprocesowych i ma ma ono zapewnić możliwość jednoczesnej pracy wielu programów w jednej instancji systemu operacyjnego. Polega na przechodzeniu do wykonywania poszczególnych bloków asynchronicznie (niezależnie od czasu jaki upłynął od zakończenia pracy poprzedniego modułu). Ten sposób tworzenia programów jest silnie powiązany z graficznymi środowiskami systemów operacyjnych i z programowaniem obiektowym. Naturalne jest więc to, że Java udostępnia ten mechanizm. Moja książka poświęca temu problemowi cały rozdział, z którego fragmentem możesz się zapoznać.

Nowa jakość tworzenia programów

Programowanie obiektowe to zupełnie nowe podejście do tworzenia programu. Jeśli połączymy hermetyzację z dziedziczeniem i polimorfizmem, otrzymamy narzędzie, które wprowadza nową jakość programowania. Wiele spraw, które dotąd były trudne do realizacji bądź wymagały wielu zabiegów nieodpornych na błędy, teraz staje się znacznie łatwiejszych i szybszych w realizacji. Projektant aplikacji czy programista może się teraz znacznie mocniej skupiać na idei tego, co chce osiągnąć, zamiast zwracać uwagę na to, jak to zrobić. Kod źródłowy jest bardziej przejrzysty i łatwiejszy do interpretacji, a przez to znacznie bardziej odporny na możliwość popełniania błędów. Znacznie łatwiej jest też prowadzić projekty grupowe, w których szczegóły implementacyjne poszczególnych składników nie wpływają na obraz całości. Osoba zajmująca się wyświetlaniem informacji z bazy danych nie musi wiedzieć, jak obiekt reprezentujący ją dogaduje się z fizyczną bazą. Programista zajmujący się skomplikowaną statystyką nie musi wiedzieć, jakie zmienne pośrednie używane są w poszczególnych działaniach macierzowych (oczywiście pod warunkiem, że nie są mu one potrzebne). Również przekazywanie pracy innemu programiście jest łatwiejsze, gdyż nowa osoba w czasie poznawania programu może stosować podejście zstępujące, to znaczy przechodzić od zagadnień najbardziej ogólnych do szczegółowych. I właśnie taką jakość daje nam Java.

Publikacje. Ostatnio dodany tekst:

Początek rozdziału 6 książki Java. Programowanie obiektowe

Programowanie wielowątkowe

W początkowej fazie tworzenia różnych języków programowania naturalne było liniowe i jednowątkowe podejście do rozwiązywania problemów stawianych przed generowanym programem. Wiadomo było, że kiedy program oblicza jakieś wartości, nie robi nic innego. W miarę pojawiania się systemów operacyjnych umożliwiających pracę równoległą i wielodostępną przestało to być takie oczywiste. W czasie, gdy jeden program coś liczył, inny mógł się komunikować z użytkownikiem, pobierać dane z dysku, drukować wyniki czy nawet obliczać inne wartości. Skoro dwa różne programy mogły pracować w tym samym czasie, naturalnym wydało się pytanie, czy jedna aplikacja może wykonywać równolegle dwie różne operacje. Próby takie podejmowano już w językach strukturalnych (dobrym przykładem jest MODULA), ale zaawansowana wielowątkowość mogła się pojawić dopiero w językach zorientowanych obiektowo. Należy jednak pamiętać, że pierwsze udane próby obliczeń równoległych prowadzono jeszcze przed pojawieniem się komputerów (z użyciem mechanicznych maszyn liczących), w czasie prac nad konstrukcją bomby atomowej, którym przewodził Richard Feynman.

...