Java – język programowania zorientowany
Transkrypt
Java – język programowania zorientowany
Java – język programowania zorientowany obiektowo Artur Piętas Poniższy artykuł przedstawia ideę programowania zorientowanego obiektowo w kontekście jednego z najpopularniejszych języków programowania, jakim jest Java. W pracy został zawarty opis kluczowych założeń podejścia obiektowego oraz podstawowe informację na temat technologii Java. 1. Programowanie zorientowane obiektowo Programowanie obiektowe dostarcza programistom wyższy poziom abstrakcji, aniżeli programowanie strukturalne czy proceduralne. Zaletami języków obiektowych są w głównej mierze łatwość pisania i konserwacji kodu, możliwość wielokrotnego wykorzystania jego fragmentów w różnych projektach oraz zgodność modeli obiektowych ze światem rzeczywistym.[1,2] Bruce Eckel w swoich publikacjach przytacza pięć głównych cech Smalltalka, będącego pierwszym językiem obiektowym. Cechy te w przejrzysty sposób obrazują ideę podejścia obiektowego: 1. Wszystko jest obiektem. Obiekt jest pewnego rodzaju zmienną przechowującą nie tylko dane, ale umożliwiającą również realizowanie na sobie pewnych operacji. Dowolne pojęcie ze świata rozwiązywanego problemu (pojazdy, budynki, zwierzęta, usługi, itd.) można wyrazić w programie za pomocą obiektu. 2. Program to zbiór obiektów, które poprzez wysyłanie komunikatów, mówią sobie nawzajem, co robić. „Wysłanie komunikatu” do obiektu jest równoznaczne z zażądaniem wykonania przez niego pewnej operacji. Innymi słowy wywoływana jest funkcja należąca do danego obiektu. 3. Każdy obiekt ma własną pamięć, w skład której wchodzą inne obiekty. Oznacza to, że nowy obiekt powstaje poprzez połączenie w jeden pakiet grupę już istniejących obiektów. W ten sposób powstają rozbudowane aplikacje, których złożoność ukryta jest za prostotą obiektów. 1 4. Każdy obiekt posiada swój typ. Innymi słowy każdy obiekt jest instancją określonej klasy, gdzie „klasa” jest synonimem „typu”. Kluczowa cechą wyróżniającą daną klasę jest odpowiedź na pytanie: „Jakie komunikaty można do niej wysyłać?”. 5. Wszystkie obiekty danego typu mogą otrzymywać te same komunikaty. To stwierdzenie okazuje się być nieco mylące. Ponieważ obiekt typu „okrąg” jest jednocześnie obiektem typu „figura”, co za tym idzie „okrąg” może otrzymywać komunikaty odpowiednie dla „figury”. Oznacza to, że istnieje możliwość pisania kodu odwołującego się do „figury”, który będzie automatycznie obsługiwał wszystkie obiekty pasujące do opisu typu „figura”. Ta „zastępowalność” jest jedną z najpotężniejszych idei programowania zorientowanego obiektowo.[1,2] 2. Ukrywanie implementacji Ukrywanie implementacji (inaczej hermetyzacja, enkapsulacja) polega na czynieniu pewnych atrybutów danego obiektu niedostępnymi w bezpośredni sposób – dane są ukryte i traktowane jako nierozdzielna całość z usługami. Twórca danej klasy udostępnia programiście – klientowi tylko te pola i metody, które są mu realnie potrzebne aby wykonać określone zadanie. Użytkownik w prosty sposób odróżnia to co jest dla niego istotne, od tego co może zignorować, nie ingerując przy tym w określone fragmenty kodu, a tym samym powodując powstawanie błędów. Z drugiej strony, twórca klasy może w prosty sposób przebudowywać swoją klasę, bez obawy o jej działanie po stronie klienta.[1] Java posiada trzy słowa kluczowe, zwane specyfikatorami dostępu służące do ustalania rozgraniczeń w klasach: 1. public (publiczny) – definicje są dostępne dla każdego, 2. private (prywatny) – dostęp do nich ma tylko twórca danej klasy wewnątrz jej funkcji składowych, 3. protected (chroniony) – działa podobnie jak private, z tą różnicą, że klasy pochodne mają dostęp do elementów chronionych swojej klasy bazowej.[1] 2 3. Dziedziczenie Idea dziedziczenia wprowadza dwa podstawowe pojęcia: klasy bazowej i klasy potomnej. Klasa potomna jest wywodzona z klasy bazowej i przejmuje jej wszystkie składowe i właściwości. Do klasy potomnej można dodać nowe atrybuty bądź zmienić istniejące. Taka zmiana określana jest jako przesłonięcie (ang. overriding) i polega na redefinicji w klasie potomnej istniejącej już metody bazowej w celu zmiany jej zachowania. [1] Rys. 1 Przykładowy diagram UML przedstawiający hierarchię klas Powyższy diagram UML przedstawia klasyczny przykład dziedziczenia z figurami geometrycznymi. Bazowym typem jest „Figura”. Posiada pięć metod (w tym wypadku publicznych) pozwalających na wykonywanie na niej pewnych operacji. Poprzez dziedziczenie wywodzone są z niej specyficzne typy figur: „Okrąg”, „Prostokąt” i „Trójkąt”. Każdy z podtypów przesłania dwie metody rysuj() i wymaz() z interfejsu klasy bazowej, które teraz będą działały inaczej. Dodatkowo z klasy „Prostokąt” wywiedziono klasę „Kwadrat”, która otrzyma wszystkie cechy klas „Figura” i „Prostokąt” oraz nową metodę obliczPole(). W rezultacie otrzymano wielopoziomową hierarchie klas. [1] W architekturze języka Java, oprócz typów podstawowych jakimi są int, float, etc, wszystko jest obiektem. Wszystkie klasy wywodzą się z klasy bazowej Object. Można zatem powiedzieć że owa architektura posiada wielopoziomową hierarchię klas o strukturze drzewa z korzeniem. Tym korzeniem jest klasa Object.[1] 3 4. Polimorfizm Polimorfizm (zwany również wiązaniem dynamicznym, późnym wiązaniem, wiązaniem czasu wykonania) jest trzecim kluczowym składnikiem języka programowania zorientowanego obiektowo, zaraz pod dziedziczeniu i abstrakcji danych. Jest to potężne narzędzie pozwalające programiście wyabstrahować od konkretnego typu. [3] Polimorficzne wywołanie metod daje możliwość danemu typowi odróżnienie siebie od innych, podobnych. Trwa to tak długo, jak długo są one wywiedzione z tego samego typu bazowego. Odróżnienie to polega na odmiennym działaniu metod, które mogą być wywoływane poprzez interfejs wspólnej klasy bazowej.[3] 5. Java – język programowania zorientowany obiektowo Java jest to uniwersalny, wieloplatformowy, obiektowy język programowania stworzony przez zespół pod kierownictwem Jamesa Goslinga z firmy Sun Microsystems. Został zaprojektowany z myślą o prostocie i niezawodności. Składnia języka jest wzorowana na C++, ale zaznaczają się wyraźne różnice w organizacji obydwu języków. Wiele aspektów z języka C++ zostało pominiętych, za to pewne mechanizmy zostały zaczerpnięte z innych języków programowania. [4] Java jest językiem silnie typowanym. Taka specyfikacja wprowadza wyraźną granicę pomiędzy błędami kompilacji, które mogą i muszą być wykryte w czasie kompilacji oraz błędami czasu wykonywania. W czasie kompilacji kod źródłowy programu zostaje przetłumaczony na kod pośredni, tzw. bytecode, który jest sekwencją instrukcji dla Wirtualnej Maszyny Javy. Na czas wykonania składają się ładowanie i podpięcie klas niezbędnych do działania danej aplikacji oraz właściwe wykonanie programu. [4] Obecnie technologia Java należy do firmy Oracle Corporation i jest stale rozwijana. Najnowsza wersja języka – Java Standard Edition 7, jest zaimplementowana na dwóch produktach tejże firmy: Java SE Development Kit (JDK) 7 oraz Java SE Runtime Environment (JRE) 7.[4] JRE 7 dostarcza bibliotek, Wirtualną Maszynę Javy (JVM) oraz inne komponenty potrzebne do uruchomienia aplikacji napisanych w języku Java. JDK 7 zawiera wszystkie elementy JRE 7, a ponadto narzędzia programistyczne takie jak kompilatory i debuggery niezbędne przy tworzeniu oprogramowania. [4] 4 Platforma Java stanowi potężne narzędzie programistyczne. W jej skład wchodzą biblioteki do obsługi protokołów sieciowych, multimediów, grafiki 3D, plików, baz danych i wiele innych. Posiada rozbudowany moduł do tworzenia graficznych interfejsów użytkownika (GUI). Poniższy diagram przedstawia strukturę komponentów technologii Java:[4] Rys. 2 Diagram komponentów języka Java SE 7 6. Bezpieczeństwo technologii Java Architekci języka Java dołożyli wszelkich starań, aby aplikacje w nim tworzone były maksymalnie niezawodne i bezpieczne. Zrezygnowano z kilku aspektów obecnych w języku C++ oraz dodano nowe mechanizmy. W ten sposób zminimalizowano liczbę przypadków przysparzających najwięcej problemów programistom i generujących najwięcej błędów. [1,4] Jedną z cech języka Java zwiększającą jego niezawodność jest brak wielokrotnego dziedziczenia. Oznacza to, że obiekt nie może być więcej niż jednego typu. Wyeliminowano przez to powstawanie struktur kratowych oraz mogące wyniknąć niejednoznaczności dziedziczenia. [1,4] Kolejny ważnym aspektem jest kontrola zakresu indeksów tablic uniemożliwiająca odwołanie się do istniejącego indeksu podczas działania programu. W języku Java tablica jest obiektem posiadającym atrybut określający jej rozmiar. [1,4] 5 Istotnym mechanizmem jest tzw. odśmiecacz pamięci (ang. Garbage Collector) eliminujący potencjalne zagrożenie związane z wyciekiem pamięci. Programista został odciążony z obowiązku jawnego niszczenia obiektów (destruktory). W momencie kiedy dany obiekt nie jest już potrzebny, pamięć po nim zostaje automatycznie zwolniona. [1,4] W technologii Java zrezygnowano z arytmetyki wskaźników. Większość programistów C++ uważa, że jest to pewne ograniczenie nałożone na twórców oprogramowania, nie mniej jednak zabieg ten poprawił niezawodność aplikacji. Wyeliminowano możliwość fałszowania bądź zmiany wskazań uchwytów do obiektów na inny obszar pamięci. [1,4] Język Java posiada bardzo rozbudowany mechanizm obsługi wyjątków. Już sam kompilator wymusza na programiście napisanie kodu obsługującego sytuację wyjątkową mogącą wystąpić w danym momencie. Dzięki temu nie występuje przypadkowość obsługi (bądź braku obsługi) błędów, co więcej zostaje ułatwiona czytelność i pielęgnacja kodu. [1,4] Nie są to wszystkie aspekty czyniące Javę językiem bezpiecznym. Z całą pewnością Javę można implementować na urządzeniach o znaczeniu krytycznym, bez obawy o sprzęt i dane, zakładając oczywiście, że twórcy systemu mają odpowiednie kwalifikacje. [1,4] 7. Podsumowanie Język Java jest obecnie najpopularniejszym język programowania. Według portalu tiobe.com zajmuje on pierwsze miejsce w rankingu języków nie tylko obiektowych posiadając 17,874% udziału (dane z października 2011r.). Technologia firmy Oracle jest wykorzystywana w bardzo dużej liczbie projektów komercyjnych. Istniej możliwość tworzenia aplikacji webowych, desktopowych, mobilnych, implementacji na różnego rodzaju urządzeniach elektronicznych. Coraz więcej osób uczy się tego języka. Przyczynia się do tego jego prostota i otwartość kodów źródłowych Javy. 6 Literatura [1] Eckel Bruce: Thinking in Java, wydanie IV, Wydawnictwo Helion, 2006, pp. 37 – 90 [2] Eckel Bruce: Thinking in C++, Wydawnictwo Helion, pp. 25 – 66 [3] Wierzbicki Marek: Java – programowanie obiektowe, Wydawnictwo Helion, 2005, pp. 11 – 31 Strony www: [4] Dokumentacja Javy ze strony Oracle: http://docs.oracle.com/javase/7/docs/ (11.2011) 7