Kontener Inversion Of Control dla obiektów Ruby realizujący wzorzec projektowy Dependency Injection
|
|
- Błażej Walczak
- 10 lat temu
- Przeglądów:
Transkrypt
1 Katedra InŜynierii Oprogramowania InŜynieria Oprogramowania i Bazy Danych Sławomir Zabkiewicz Nr albumu 5081 Kontener Inversion Of Control dla obiektów Ruby realizujący wzorzec projektowy Depency Injection Praca magisterska Napisana pod kierunkiem dra inŝ. Mariusza Trzaski Warszawa, wrzesień, 2009
2 Streszczenie Paradygmat Inversion of Control, czyli odwrócenie sterowania w projektach programistycznych polega przede wszystkim na przeniesieniu odpowiedzialności za kontrolę wybranych czynności na zewnątrz obiektu, komponentu. Najpopularniejszą obecnie realizacją tego paradygmatu jest wstrzykiwanie zaleŝności - Depency Injection. Zagadnienie to jest bardzo popularne w środowisku programistów języka Java, gdzie funkcjonuje aktualnie kilka bardzo rozbudowanych implementacji wzorców projektowych przenoszących odpowiedzialność za tworzenie obiektów i ich łączenie do kontenerów Inversion of Control. PoniŜsza praca koncentruje się na jednym z tych wzorców, a głównym jej celem było stworzenie implementacji Depency Injection w skryptowym języku Ruby. Dostępne w nim techniki metaprogramowania oraz dynamiczny charakter samego języka pozwalają w prosty i przyjemny sposób stworzyć minimalistyczną wersję kontenera obiektów, który bardzo łatwo moŝna rozszerzać o dodatkowe funkcje. Ruby jest stale rozwijanym stosunkowo nowym językiem programowania. Ze względu na prostotę i czytelność programów oraz jednocześnie wszechobecną obiektową składnię daje bardzo wiele moŝliwości i dzięki temu zyskuje wielu zwolenników. Stworzony na potrzeby tej pracy kontener dla obiektów Ruby stanowi istotne rozszerzenie moŝliwości języka i jednocześnie pozwala znacznie zmniejszyć kod oprogramowania. Jest to szczególnie waŝne przy tworzeniu duŝych zespołowych projektów programistycznych. Ułatwia szybką zmianę i zapewnia łatwą konserwację takich projektów. W celu zaprezentowania poprawności działania kontenera Inversion of Control została przygotowana, równieŝ w języku Ruby, aplikacja obsługująca protokół XML-RPC. UŜycie w tej aplikacji wstrzykiwania zaleŝności oraz kontroli nad obiektami przez kontener pozwala programiście skoncentrować się na tym, co waŝne na implementacji samego protokołu. Podziękowania Autor składa serdeczne podziękowania dla Pana dra inŝ. Mariusza Trzaski za opiekę nad projektem, konsultacje i cenne uwagi przekazywane w trakcie tworzenia niniejszej pracy. 2
3 Spis treści: 1. WSTĘP KONTEKST PRACY CEL PRACY REZULTAT PRACY INVERSION OF CONTROL CZYLI ODWRACANIE STEROWANIA INVERSION OF CONTROL Depency Lookup Depency Injection PORÓWNANIE USŁUG INVERSION OF CONTROL PORÓWNANIE TYPÓW DEPENDENCY INJECTION PODSUMOWANIE ISTNIEJĄCE IMPLEMENTACJE DEPENDENCY INJECTION APACHE AVALON SPRING FRAMEWORK PICOCONTAINER GOOGLE GUICE PODSUMOWANIE TECHNOLOGIE WYKORZYSTANE PRZY TWORZENIU PRACY RUBY JĘZYK PROGRAMOWANIA Podstawy języka Duck Typing Klasy i Obiekty Metaprogramowanie Podsumowanie IMPLEMENTACJA WZORCA DEPENDENCY INJECTION W RUBY BIBLIOTEKA DLA JĘZYKA RUBY Kontener Inversion of Control Wstrzykiwanie zaleŝności PRZYKŁAD UśYCIA SERWER XML-RPC XML-RPC LibXML Rack Dostawca VmServant PODSUMOWANIE WADY, ZALETY ORAZ PERSPEKTYWY ROZWOJU PRACE CYTOWANE
4 1. Wstęp W dzisiejszych czasach duŝa część oprogramowania pisana jest w celu zautomatyzowania pewnych rzeczywistych procesów. Zasadniczym utrudnieniem w tej dziedzinie jest sposób automatycznego połączenia ze sobą, wydawałoby się niezaleŝnych elementów języków programowania, takich jak obiekty. Problem ten związany jest z paradygmatem odwrócenia sterowania (ang. Inversion of Control, IoC), który polega na przeniesieniu odpowiedzialności za kontrolę wybranych czynności na zewnątrz obiektu. W opisywanym przypadku jest to czynność tworzenia powiązań pomiędzy obiektami. Ten przypadek odwrócenia sterowania nazywany jest wstrzykiwaniem zaleŝności (ang. Depency Injection, DI) i polega na tworzeniu połączeń między komponentami w postaci architektury plug-in. W ostatnich latach powstało kilka niezaleŝnych implementacji wzorca Depency Injection w róŝnych językach programowania. Dla coraz bardziej popularnego języka Ruby istnieją dwa powiązane ze sobą rozwiązania, Needle oraz Copland. Są one jednak dosyć oporne i przeładowane nawykami z języka Java, które w tak innowacyjnym i dynamicznym środowisku jak Ruby nie powinny się znaleźć. W efekcie sam autor tych dwóch rozwiązań zachęca, aby ich nie uŝywać Kontekst pracy W drugim rozdziale opisane są zagadnienia stojące u podstaw paradygmatu Inversion of Control. Zaprezentowane zostały róŝne podejścia do odwrócenia sterowania, przy czym największy nacisk połoŝony został na wzorzec projektowy Depency Injection oraz sposoby jego implementacji. Rozdział zakończony jest szczegółową analizą porównawczą dwóch podstawowych typów Depency Injection Constructor Depency Injection oraz Setter Depency Injection. Rozdział Istniejące implementacje wzorca Depency Injection dotyczy zagadnienia Depency Injection oraz przedstawia istniejące implementacje tego wzorca w róŝnych językach programowania. Nacisk połoŝony został na rozwiązaniach w języku Java, poniewaŝ to właśnie w związku z nim narodziło się pojęcie wstrzykiwania zaleŝności i aktualnie Java jest wiodącym językiem programowania ze względu na ilość dostępnych rozwiązań. PoniewaŜ część z nich stanowi odpowiedź na potrzeby oraz problemy ściśle związane z tą jedną technologią, w bardzo dobry sposób ukazują efektywność oraz sposób uŝycia Depency Injection. Rozdział ten stanowi przegląd bibliotek realizujących wstrzykiwanie zaleŝności począwszy od najwcześniejszych (Apache Avalon) poprzez najpopularniejsze (Spring, PicoContainer), aŝ po te nowoczesne oraz najbardziej zaawansowane (Google Guice). Rozdział czwarty to opis rozwiązań implementacyjnych. Przedstawione zostały podstawy języka Ruby oraz jego zaawansowane elementy, które w duŝym stopniu związane są z implementacją wzorca Depency Injection. Szczególna uwaga zwrócona została na typy danych występujące w języku oraz sposób ich deklaracji. Najwięcej miejsca poświęcone zostało pojęciom obiektu i klasy oraz ich modyfikowaniu (metaprogramowanie). W rozdziale 5 znajduje się opis implementacji wzorca Depency Injection w języku Ruby. Zaprezentowane zostały sposoby oraz przykłady uŝycia zarówno kontenera obiektów 4
5 jak i obsługi zaleŝności. Przykładem wykorzystania biblioteki jest opisany szczegółowo serwer XML-RPC, który realizuje ideę zdalnych obiektów poprzez wykorzystanie odwrócenia sterowania w postaci dostawców zarządzanych przez kontener. W ostatnim rozdziale znajduje się podsumowanie pracy. Opisane są trudności napotkane podczas wykonywania pracy oraz wyciągnięte wnioski. Przede wszystkim zaprezentowane zostały moŝliwości dalszej rozbudowy zaimplementowanej biblioteki realizującej wzorzec Depency Injection umoŝliwiający tworzenie środowiska typu enterprise w języku Ruby. PoniewaŜ praca jest ściśle związana z językiem programowania Ruby większość przykładów kodu prezentowana jest w języku Ruby. Jedynie kod mający na celu ukazanie pewnych charakterystycznych zagadnień dla innych języków programowania oraz przykłady wykorzystania istniejących implementacji Depency Injection prezentowane są w tych językach Cel pracy Celem poniŝszej pracy jest przegląd dostępnych rozwiązań w dziedzinie paradygmatu Inversion od Control oraz stworzenie implementacji wzorca Depency Injection dla języka Ruby, która będzie tak dynamiczna i prosta w uŝyciu jak sam język. Pośrednio autor niniejszej pracy postawił sobie za cel omówienie oraz usystematyzowanie informacji na temat metaprogramowania oraz zarządzania typami w języku Ruby. Dodatkowo, zaprezentowany przykład uŝycia biblioteki, serwer XML-RPC, stanowi nawiązanie do moŝliwości wykorzystania samego języka jak i implementacji Depency Injection do tworzenia systemów rozproszonych Rezultat pracy Rezultatem pracy jest w pełni funkcjonalna biblioteka implementująca wzorzec Depency Injection w języku Ruby, umoŝliwiająca programistom proste wstrzykiwanie zaleŝności przy uŝycia dostarczonego kontenera obiektów. Serwer XML-RPC stanowiący przykład uŝycia biblioteki to minimalistyczny serwer udostępniający funkcjonalność zdalnych obiektów. Obie aplikacje wykorzystują w pełni moŝliwości języka Ruby, a w szczególności jego technik metaprogramowania. 5
6 2. Inversion Of Control czyli odwracanie sterowania. W świecie tworzenia oprogramowania, duŝy nacisk kładzie się na jego utrzymywanie. Zdarza się, Ŝe więcej czasu jest poświęcone na zarządzanie kodem, niŝ na jego pisanie. Wymaga to zarówno prawidłowego projektowania oprogramowania jak i dobrze zdefiniowanego procesu walidacji oraz testowania. Testowanie kodu jest niezbędnym etapem tworzenia oprogramowania. Proces testowania ma zapewnić, Ŝe stworzony kod działa zgodnie z załoŝeniami. Jest to tylko jeden z elementów wchodzących w skład procesu utrzymywania oprogramowania. Kolejnym sposobem jest tworzenie mniejszej ilości kodu bez utraty funkcjonalności. Im mniej kodu potrzeba do osiągnięcia celu, tym mniej kodu do utrzymywania [1]. DuŜa część instrukcji jest zbędna, poniewaŝ pozwala jedynie na przejście z jednego miejsca programu do drugiego. To właśnie z tym zbędnym kodem programiści i projektanci starają się sobie poradzić, uŝywając mechanizmów opisanych w tej pracy. W rozdziale tym, zostaną dokładnie opisane zagadnienia paradygmatu Inversion of Control oraz wzorca projektowego Depency Injection Inversion of Control Przed przystąpieniem do opisu wzorca projektowego Depency Injection, naleŝy przedstawić paradygmat, który leŝy u podstaw powstania tego wzorca. Paradygmat ten nazywa się Inversion of Control (odwrócenie sterowania) i polega na przeniesieniu odpowiedzialności za kontrolę wybranych czynności na zewnątrz komponentu. Te dwa pojęcia są bardzo często ze sobą mylone lub uŝywane jako synonimy. Tymczasem Depency Injection jest jedynie formą realizacji pewnej części odwrócenia sterowania. Inversion of Control jest pojęciem znacznie ogólniejszym, i jak zauwaŝa Martin Fowler w [5] w przypadku implementacji kontenerów IoC, naleŝy sobie zadać pytanie, jaki aspekt kontroli chcemy odwrócić. Najczęściej jest to tworzenie powiązań pomiędzy komponentami. Tradycyjne podejście do programowania zakłada tworzenie zaleŝności pomiędzy komponentami w nich samych jak pokazano na rysunku 1. Rysunek 1. Tradycyjne podejście do komponentów programistycznych. na podstawie Fitech Laboratories Inc. Technical Whitepaper xtier IoC-based System Configuration 6
7 Kontenery obiektów realizujące paradygmat Inversion of Control dostarczają komponentom mechanizmów dostępu do ich zaleŝności (innych komponentów) w czasie ich cyklu Ŝycia, co ilustruje rysunek 2. Rysunek 2. Podejście do komponentów zgodne z paradygmatem Inversion of Control. na podstawie Fitech Laboratories Inc Technical Whitepaper xtier IoC-based System Configuration Przez autorów Pro Spring [2] zaproponowany został podział usług realizowanych przez kontenery IoC przedstawiony na rysunku 3. Rysunek 3. Podział usług Inversion of Control. Depency Lookup jest podejściem tradycyjnym i popularnym wśród programistów języka Java. Depency Injection jest nowym wzorcem, przyjętym bardzo szybko i mimo, Ŝe wydaje się być mało intuicyjny na pierwszy rzut oka, niemniej jednak jest duŝo bardziej elastyczny w uŝyciu niŝ Depency Lookup. W przypadku Depency Lookup, komponent musi pozyskać referencję do komponentu zaleŝnego. W Depency Injection zaleŝności są wstrzykiwane do komponentów przez kontener Inversion Of Control.[2] Depency Lookup Wzorzec Depency Lookup moŝe być zaimplementowany na dwa róŝne sposoby: 1. Depency Pull 2. Contextualized Depency Lookup (CDL) 7
8 Depency Pull Ten typ Depency Lookup jest często uŝywany przez programistów języka Java i polega na wyciąganiu zaleŝności z rejestru, kiedy zachodzi potrzeba. Przykład 1: class Car def = get_registry() def run engine=@registry.get_object( engine ) engine.start W przykładzie 1 w konstruktorze obiektu klasy Car pobierany jest pewien rejestr zaleŝności przy pomocy metody get_registry(). Przy wywołaniu metody run() na obiekcie klasy Car pobierana jest z rejestru zaleŝność pewien komponent engine, który realizuje właściwą funkcjonalność dzięki swojej metodzie start(). Contextualized Depency Lookup (CDL) CDL jest podobne to Depency Pull. RóŜni się jedynie tym, Ŝe wyszukiwanie zaleŝności odbywa się w kontenerze, który zarządza danym komponentem, nie w centralnym rejestrze środowiskowym. Contextualized Depency Lookup moŝe być realizowane przez komponent implementujący interfejs. Przykład 2: module ManagedObject def lookup(registry,object_name) registry.get_object(object_name) class Message include ManagedObject def def def registry.add(new Message()) registry.managed_objects.each do obj obj.perform_lookup(registry) message.run 8
9 Występują tu dwie klasy. Klasa Message implementuje moduł (interfejs) ManagedObject, dzięki któremu ma dostęp do metody lookup (container,object_name). Tworzony jest nowy obiekt klasy Message i dodawany do rejestru, w którym znajduje się juŝ obiekt klasy Writer. Następnie na wszystkich obiektach rejestru implementujących moduł ManagedObject wywoływana jest metoda perform_lookup, która w obiekcie klasy Message wywołuje metodę lookup w poszukiwaniu obiektu klasy Writer. Wywołanie metody run na obiekcie klasy Message de facto powoduje uruchomienie metody display na wcześniej pobranej zaleŝności prowadzącej do obiektu klasy Writer Depency Injection Podobnie jak Depency Lookup, Depency Injection moŝe być zaimplementowany na trzy róŝne sposoby: 1. Constructor Depency Injection 2. Setter Depency Injection 3. Interface Depency Injection Aby zrozumieć róŝnice pomiędzy Constructor Depency Injection oraz Setter Depency Injection naleŝy zrozumieć róŝnice pomiędzy metodami a konstruktorami. Konstruktory posiadają zasadnicze ograniczenia narzucone im przez języki programowania (np.: konstruktor moŝe być wywołany tylko raz). [3] Constructor Depency Injection Zadaniem konstruktora jest zainicjowanie obiektu oraz jego początkowa konfiguracja przy uŝyciu dostarczonych do niego argumentów. Początkowa konfiguracja moŝe polegać na wstrzykiwaniu zaleŝności, co jest przedmiotem tej pracy lub na operacjach, które powinny zostać wykonane zanim obiekt zostanie uŝyty. Konstruktor posiada kilka ograniczeń, które odróŝniają go od standardowych metod. Konstruktor: nie zwraca Ŝadnej wartości, moŝe być wywołany tylko raz, jego nazwa jest wymuszona nazwą klasy. Konstruktory dostępne są w większości obiektowych języków programowania jako sposób prawidłowego przygotowania obiektu do uŝycia. Constructor Depency Injection zakłada, Ŝe zaleŝności, które mają zostać wstrzyknięte do komponentu dostarczone są w jego konstruktorze. Komponent posiada deklarację konstruktora lub listy konstruktorów przyjmujących argumenty będące jego zaleŝnościami. Kontener Inversion of Control wstrzykuje te zaleŝności do komponentu podczas jego inicjalizacji. Rysunek 4 przedstawia działania przeprowadzane kolejno przez kontener IoC w celu wykonania Constructor Depency Injection. [3] 9
10 Rysunek 4. Schemat działania Constructor Depency Injection. Źródło: [3] Przykład 3: class Message attr_reader :writer def W powyŝszym przykładzie, argumentem konstruktora klasy Message jest pewien obiekt writer. Podczas tworzenia obiektu klasy Message w jego konstruktorze następuje wstrzyknięcie zaleŝności do atrybutu obiektu. Setter Depency Injection W przypadku tego typu Depency Injection, kontener Inversion of Control wstrzykuje zaleŝności do komponentu uŝywając do tego zadeklarowanych operacji dostępowych (tzw. settery). Settery komponentu określają zbiór zaleŝności, którymi kontener Inversion of Control moŝe zarządzać. Rysunek 5 przedstawia kroki, jakie muszą być wykonane, aby przygotować obiekt przy uŝyciu Setter Depency Injection. Rysunek 5. Schemat działania Setter Depency Injection. Źródło: [3] 10
11 Sekwencja wykonywanych operacji jest niemal identyczna jak w przypadku Constructor Depency Injection. Jedynie operacja dostępowa (setter) jest uŝyta w miejscu konstruktora a wstrzykiwanie zaleŝności odbywa się juŝ po utworzeniu instancji komponentu. Przykład 4: class Message def Tym razem do wstrzyknięcia zaleŝności obiektu writer uŝyta jest metoda dostępowa set_writer. Konieczność uŝycia powyŝszej metody przez kontener wymuszona jest przez przyjętą w danej implementacji Inversion Of Control konwencję nazw. W powyŝszym przykładzie jest to prefix set_ w nazwie metody dostępowej. Interface Depency Injection Ten typ Depency Injection jest bardzo podobny do Setter Depency Injection. ZaleŜności wstrzykiwane są przez metody dostępowe zadeklarowane w interfejsach. KaŜdy setter wydzielony jest do osobnego interfejsu. Przykład 5: module WriterInjectable def class Message include WriterInjectable Klasa Message implementuje interfejs WriterInjectable, w którym zadeklarowana jest metoda set_writer. Klasa Message moŝe implementować wiele interfejsów, z których kaŝdy odpowiada za wstrzyknięcie jednej zaleŝności: Przykład 6: class Message include WriterInjectable include LogInjectable include DBInjectable 2.2. Porównanie usług Inversion of Control Depency Injection jest zdecydowanie lepszym rozwiązaniem od Depency Lookup. JeŜeli przyjrzymy się przykładom 3 oraz 4, wyraźnie widać, Ŝe uŝycie wstrzykiwania zaleŝności nie ma Ŝadnego wpływu na kod macierzystego komponentu. 11
12 Kod Depency Pull (Przykład 1) jednocześnie aktywnie uczestniczy w wyszukiwaniu zaleŝności w centralnym rejestrze. Z kolei CDL (Przykład 2) wymaga, aby klasy implementowały specyficzny interfejs a wyszukiwanie zaleŝności musi być równieŝ zawarte w kodzie. Przy uŝyciu Depency Injection klasa komponentu powinna jedynie umoŝliwić wstrzykiwanie zaleŝności przez kontener przy uŝyciu konstruktorów lub operacji dostępowych. W tym przypadku istnieje moŝliwość uŝycia klas całkowicie niezaleŝnie od kontenera Inversion of Control. ZaleŜności mogą zostać dodane do komponentu ręcznie. W przypadku Depency Lookup komponenty są bardzo mocno związane z kontenerem i trudno jest testować je w środowisku izolowanym. Testowanie w przypadku Depency Injection jest proste, gdyŝ nic nie stoi na przeszkodzie, aby ręcznie dodać zaleŝności do komponentu uŝywając stosownego konstruktora lub operacji dostępowej. Rozwiązania Depency Lookup są, z konieczności, duŝo bardziej złoŝone niŝ Depency Injection. Wstrzykiwanie zaleŝności upraszcza w duŝym stopniu Ŝycie programisty. Pisany kod jest krótszy oraz prostszy. Jego tworzenie moŝe być zautomatyzowane przez wiele dostępnych IDE. NaleŜy zwrócić uwagę, Ŝe przykłady 3 oraz 4 przedstawiają bierny kod, który nie próbuje aktywnie wykonać swojego zadania. To jest właśnie siła oraz prostota Depency Injection, poniewaŝ bierny kod jest duŝo prostszy do utrzymania niŝ ten aktywny. Przykład 7 przedstawia metodę perform_lookup. Przykład 7: def W powyŝszym kodzie znajduje się wiele miejsc, w których moŝe wystąpić błąd. Nazwa zaleŝności writer moŝe ulec zmianie. Instancja kontenera (registry) moŝe być pusta (nil) lub otrzymana zaleŝność moŝe mieć niewłaściwy typ (w przypadku języków ze statyczną kontrolą typów). UŜycie Depency Lookup umoŝliwia podział aplikacji, ale wymaga duŝej ilości dodatkowego kodu, aby połączyć jej komponenty na nowo, co znacznie utrudnia jej utrzymanie. [2] 2.3. Porównanie typów Depency Injection Najrzadziej uŝywanym i najmniej wygodnym typem Depency Injection jest Interface Injection. W przykładzie 5 i 6 widzieliśmy, ze jest dosyć rozwlekły i mało przyjemny w uŝyciu, poniewaŝ wymaga duŝej ilości kodu. Constructor Depency Injection uŝywany jest, kiedy konieczne jest, aby zaleŝności zostały utworzone zanim komponent zostanie uŝyty. Większość kontenerów Inversion of Control dostarcza zbiór mechanizmów umoŝliwiających wstrzykiwanie zaleŝności przy pomocy operacji dostępowych (settery), natomiast Constructor Injection jest metodą definiowania zaleŝności do komponentu niezaleŝnie od kontenera. JeŜeli komponent udostępnia kontenerowi swoje zaleŝności, ale moŝe posiadać dla nich własne wartości domyślne, wtedy powinien zostać uŝyty Setter Depency Injection. 12
13 Generalnie, róŝnice pomiędzy obydwoma typami Depency Injection są analogiczne do róŝnic pomiędzy definiowaniem atrybutów komponentu poprzez konstruktor lub operację dostępową. W przypadku, gdy chcemy, aby atrybut został zmodyfikowany tylko raz (przy tworzeniu komponentu) wtedy oznacza to, nie tylko, Ŝe komponent moŝe polegać na swoich zaleŝnościach finalnych w trakcie całego cyklu Ŝycia, ale równieŝ, Ŝe są one dostępne do uŝycia przy jego tworzeniu. Są to atrybuty stałe. Jest to forma tymczasowej hermetyzacji. W odniesieniu do wstrzykiwania zaleŝności, podejście to moŝe być przedstawione jako zamraŝanie kompletnej i uformowanej juŝ struktury obiektów. MoŜna to bardzo łatwo przedstawić w języku Java na przykładzie deklarowania atrybutów finalnych. Przykład 8 przedstawia klasę Atlas. Przykład 8: public class Atlas { private final Earth earthonback; Źródło: [3] public Atlas(Earth earth) { this.earthonback = earth; } } KaŜda próba zmiany atrybutu earthonback wygeneruje wyjątek podczas fazy kompilowania. Jest to przydatna funkcjonalność gdyŝ zapewnia stały stan obiektu. Stałość atrybutów nie jest moŝliwa przy uŝyciu Setter Depency Injection. Operacje dostępowe nie róŝnią się niczym od zwykłych metod. Oznacza to, Ŝe w przypadku zachowania niezmienności zaleŝności komponentu Constructor Depency Injection jest lepszym wyborem. Kolejnym problemem związanym z operacjami dostępowymi jest ich szybki przyrost. JeŜeli komponent posiada kilka zaleŝności, tworzenie settera dla kaŝdej z nich zaowocuje duŝą ilością powtarzalnego kodu. Z drugiej strony konstruktory przyjmujące wiele argumentów są bardzo nieczytelne. Istnienie wielu argumentów tego samego typu moŝe być mylące, poniewaŝ jedyną rzeczą, która je odróŝnia jest ich kolejność. Przykład 9 prezentuje klasę Person w języku Java. Przykład 9: public class Person { private String firstname; private String lastname; private String nickname; public Person(String name1, String name2, String name3) {.. } } new Person( John, Doe, johhny ); PoniewaŜ wszystkie atrybuty klasy Person są typu String, najmniejszy błąd w nazewnictwie lub kolejności argumentów konstruktora zaowocuje błędnym ustawieniem zaleŝności. W przypadku Setter Depency Injection wstrzykiwanie zaleŝności jest przejrzyste. 13
14 Przykład 10: Person person = new Person(); person.setfirstname( John ); person.setlastname( Doe ); person.setnickname( johnny ); W przykładzie 10 wyraźnie widać, Ŝe Setter Depency Injection jest duŝo bardziej wygodne, gdy operuje się na wielu zaleŝnościach tego samego typu. Ma to swoje zastosowanie szczególnie w testach jednostkowych, kiedy istnieje konieczność ustawienia zaleŝności ręcznie. Kolejnym problemem związanym z Constructor Depency Injection jest duŝa ilość permutacji zestawu zaleŝności w komponencie. Oznacza to, Ŝe zaleŝności mogą być wstrzykiwane w róŝny sposób. MoŜe to prowadzić do niekontrolowanego przyrostu liczby konstruktorów. Przykład 11 przedstawia klasę Amphibian w języku Ruby. Przykład 11: class Amphibian attr_reader :gills attr_reader :lungs attr_reader :heart def initialize(heart, = = gills def initialize(heart, = = lungs Kiedy potrzebujemy obiektu klasy Amphibian (płaz), który porusza się po wodzie, konstruujemy go przy uŝyciu skrzeli (gills). Na lądzie obiekt klasy Amphibian zostanie utworzony przy uŝyciu płuc (lungs). Serce (heart) jest wspólne dla obu przypadków. W powyŝszym przykładzie potrzebujemy dwóch oddzielnych konstruktorów przystosowanych do kaŝdego scenariusza. W przypadku większej ilości scenariuszy wzrośnie równieŝ liczba konstruktorów. Spowoduje to trudności w czytaniu kodu i rozróŝnieniu poszczególnych konstruktorów. Zjawisko to nazywane jest piramidą konstruktorów. Rozwiązaniem tego problemu jest Setter Depency Injection, które pozwala zarządzać dowolną ilością permutacji zbioru zaleŝności danego komponentu bez potrzeby pisania dodatkowego kodu. Pętla referencyjna Istnieje moŝliwość wystąpienia wzajemnej zaleŝności pomiędzy komponentami. Rysunek 6 przedstawia taką relację. 14
15 Rysunek 6. Relacja kołowa pomiędzy komponentami w Constructor Depency Injection. Źródło: [3] Taka symbiotyczna relacja pomiędzy dwoma komponentami często występuje w zaleŝności rodzic-dziecko. Przykład 12: class Master attr_reader :slave def class Slave attr_reader :master def W przykładzie 12 Master i Slave odwołują się do siebie nawzajem. Komponent Master posiada referencję do komponentu Slave, a komponent Slave z kolei posiada powrotną referencję do komponentu Master. JeŜeli zdecydujemy się na utworzenie instancji klasy Master jako pierwszej, aby stan obiektu był poprawny, potrzebuje on instancji Slave jako zaleŝności. W związku z tym jesteśmy zmuszeni utworzyć najpierw instancję klasy Slave. Niestety sytuacja się powtarza, poniewaŝ konstruktor klasy Slave wymusza istnienie instancji klasy Master. Jest to klasyczny problem jajko-kura. Zjawisko to nazywane jest relacją kołową. MoŜemy utworzyć niebezpośrednią relację kołową, w której komponent A odwołuje się do komponentu B, komponent B odwołuje się do komponentu C, który z kolei wraca ponownie do komponentu A. Sytuację taką przedstawia rysunek 7. 15
16 Rysunek 7. Niebezpośrednia relacja kołowa pomiędzy komponentami. PowyŜszy przypadek jest najczęściej spotykany. Oczywiście komponenty moŝna dokładać bez ograniczeń dopóty dopóki ich końce się spotykają. Nie ma jasnej strategii mówiącej, która instancja powinna być utworzona jako pierwsza. Rozwiązaniem ponownie staje się Setter Depency Injection. Przykład 13 przedstawia przypadek, w którym dwa komponenty posiadają referencje do siebie nawzajem. Przykład 13: class Master attr_reader :slave def class Slave attr_reader :master def W powyŝszym przykładzie klasy Master oraz Slave posiadają odpowiednie operacje dostępowe słuŝące do utworzenia zaleŝności pomiędzy nimi. Stosowna konfiguracja kontenera Inversion of Control pozwoli na zrealizowanie tych relacji. Obiekty obu klas zostaną utworzone przy uŝyciu ich domyślnych konstruktorów, które nie przyjmują Ŝadnych argumentów. Następnie przy pomocy operacji dostępowych set_slave oraz set_master kontener utworzy wymagane zaleŝności Podsumowanie Wstrzykiwanie zaleŝności poprzez metody dostępowe do komponentów jest zdecydowanie bardziej elastyczne od wstrzykiwania poprzez konstruktory, zwłaszcza, jeŝeli nie ma konieczności tworzenia wszystkich relacji pomiędzy komponentami jednorazowo. 16
17 Niewątpliwą wadą Setter Depency Injection, w przypadku języków ze statyczną kontrolą typów, jest brak moŝliwości utworzenia zaleŝności stałych (finalnych). Constructor Depency Injection pozwala na tworzenie zaleŝności finalnych, wymaga mniej kodu do napisania oraz zabezpiecza programistę przed przypadkowym nadpisaniem istniejących juŝ zaleŝności, do czego mogłoby dojść w przypadku uŝycia operacji dostępowych. Mimo tego, podejście takie stwarza jednak wiele niedogodności. W przypadku istnienia większej liczby zaleŝności trudno jest zarządzać tak duŝą ilością konstruktorów. Dodatkowo w przypadku pętli referencyjnej, gdy dwa komponenty nawzajem od siebie zaleŝą, niemoŝliwe jest wstrzyknięcie wzajemnych zaleŝności przy pomocy Constructor Depency Injection. Znakomicie w tej sytuacji sprawdza się natomiast wstrzykiwanie zaleŝności przy pomocy metod dostępowych, poniewaŝ oba obiekty mogą zostać utworzone w postaci niekompletnej, a następnie połączone ze sobą. Wstrzykiwanie zaleŝności opiera się na zarządzalnych oraz testowalnych komponentach zorganizowanych w wyraźnie wydzielone moduły, które mogą być składane, konstruowane oraz wdraŝane w wielu róŝnych konfiguracjach. UmoŜliwia to programiście podział kodu na wydzielone oraz uporządkowane części. Taki podział ma ogromne znaczenie przy testowaniu oraz zarządzaniu kodem, zwłaszcza w przypadku duŝych zespołowych projektów. W proponowanej w tej pracy implementacji wzorca Depency Injection wykorzystany został wariant Setter Depency Injection. Wybór uzaleŝniony był częściowo od technologii wykonania projektu. Język Ruby jest bardzo dynamicznym językiem i brak w nim mechanizmu stałych (finalnych) zaleŝności. Dynamika ta powoduje, Ŝe wstrzykiwanie zaleŝności poprzez metody dostępowe jest wygodnym sposobem łączenia komponentów i nie oznacza konieczności pisania większej ilości kodu. 17
18 3. Istniejące Implementacje Depency Injection Rozdział ten stanowi wprowadzenie do istniejących implementacji wzorca projektowego Depency Injection. Skoncentrujemy się na rozwiązaniach w języku Java, poniewaŝ to właśnie w związku z nim narodziło się to pojęcie i aktualnie Java jest wiodącym językiem programowania ze względu na ilość dostępnych rozwiązań. PoniewaŜ część z nich stanowi odpowiedź na potrzeby oraz problemy ściśle związane z tą jedną technologią, w bardzo dobry sposób ukazują efektywność oraz sposób uŝycia Depency Injection. Niniejszy rozdział stanowi przegląd bibliotek realizujących wstrzykiwanie zaleŝności począwszy od najwcześniejszych (Apacze Avalon) poprzez najpopularniejsze (Spring, PicoContainer), aŝ po te nowoczesne oraz najbardziej zaawansowane (Google Guice). W poniŝszym rozdziale przykłady uŝycia poszczególnych bibliotek implementujących wzorzec Depency Injection oparte będą na bardzo prostym konkretnym problemie biznesowym. Rysunek 8 przedstawia diagram UML opisujący klasę Gateway, która reprezentuje bramkę płatności kartami kredytowymi w Internecie. Klasa MerchantImpl implementująca interfejs Merchant reprezentuje natomiast dostawcę usług autoryzujących karty kredytowe. Rysunek 8. Diagram klas dla usługi płatności kartami kredytowymi. Aby dokonać płatności naleŝy wywołać metodę authorize na obiekcie klasy MerchantImpl. Atrybut login tej klasy oznacza ciąg znaków niezbędnych do uwierzytelniania w systemie dostawcy usługi płatności kartami kredytowymi. Przykład 14 prezentuje klasę Gateway. Przykład 14: public class Gateway { public MerchantImpl merchant; } public Gateway(MerchantImpl merchant) { this.merchant=merchant; } Bez uŝycia Depency Injection zaleŝność w postaci obiektu klasy MerchantImpl musi być ręcznie dodana przy tworzeniu obiektu klasy Gateway jako argument konstruktora. 18
19 Przykład 15 przedstawia interfejs Merchant oraz implementującą go klasę MerchantImpl. Przykład 15: public interface Merchant { Boolean authorize(double amount, String orderref); } } public class MerchantImpl implements Merchant { String login; Double amount; String orderref; public MerchantImpl(String login) { this.login=login; XmlRpc.setDriver("SAXParser"); } public Boolean authorize(string cardnumber, Double, amount, String orderref){ XmlRpcClient client = new XmlRpcClient(this.login); } Vector params = new Vector( ); params.addelement(cardnumber); params.addelement(amount); params.addelement(orderref); Integer responsecode = (String) client.execute( Payment.authorize,params); if(responsecode==100) return true; else return false; Klasa MerchantImpl reprezentuje dostawcę usługi płatności kartami kredytowymi. Implementuje interfejs Merchant realizując metodę authorize jako wywołanie XmlRPC na zewnętrznym API dostępnym na serwerze dostawcy. Klasa MerchantImpl nawiązuje połączenie z usługodawcą uŝywając atrybutu login, który definiowany jest w konstruktorze. Aby dokonać płatności kartą kredytową naleŝy dostawcy wysłać jej numer (cardnumber), kwotę płatności (amount) oraz unikalny identyfikator zamówienia (orderref). Metoda authorize zwraca true w przypadku, gdy płatność się powiedzie oraz false w przypadku wystąpienia błędu. Motywacją do uŝycia Depency Injection jest automatyzacja konfiguracji dostawcy usługi płatności kartami kredytowymi (Merchant) dla naszej bramki (Gateway). Nie będziemy zajmować się implementacją interfejsu Merchant (jest ona zazwyczaj dostarczana przez usługodawcę). Jedynym atrybutem, który musimy konfigurować jest login, który choć jest wartością charakterystyczną dla kaŝdego usługobiorcy, nie zmienia się na tyle często, aby definiować go za kaŝdym razem. Chcemy zautomatyzować konfigurację naszej bramki do płatności kartami kredytowymi uŝywając do tego dostępnych implementacji wzorca Depency Injection. 19
20 3.1. Apache Avalon Biblioteką realizującą wzorzec Depency Injection, która powstała najwcześniej jest Apache Avalon. Pojawiła się ona w 1999 roku, a w 2002 wydzieliła się z projektu Apache Jakarta. Stanowiła kompletny kontener aplikacji jeszcze przed pojawieniem się Java Enterprise Edition. Najbardziej znanym systemem opartym na Apache Avalon jest Apache James Server, który jest serwerem pocztowym obsługującym protokoły SMTP, POP3 oraz IMAP. Avalon-Framework (często zwany równieŝ AF, lub AF4 od 4 wersji) definiuje kilka interfejsów reprezentujących cykl Ŝycia komponentu, które dostarczają wspólny schemat tworzenia, inicjalizowania oraz konfigurowania komponentów. Avalon dostarcza wstrzykiwanie zaleŝności poprzez omówiony w poprzednim rozdziale Contextualized Depency Lookup. Komponenty kontenera Avalon implementują pewien interfejs Serviceable, który przedstawiony jest w przykładzie 16. Przykład 16: public interface Serviceable { public void service(servicemanager sm) throws ServiceException; } Komponent implementujący interfejs Serviceable, będzie uŝywał dostarczonego obiektu klasy ServiceManager, aby uzyskać dostęp do innych komponentów istniejących w środowisku. Interfejs ServiceManager przedstawiony jest w przykładzie 17. Przykład 17: public interface ServiceManager { boolean hasservice(string key); Object lookup(string key) throws ServiceException; void release(object object); } Źródło: [9] Implementacja interfejsu Serviceable oznacza, Ŝe komponent moŝe uŝywać innych komponentów, ale nie precyzuje tego, co komponent robi. W przykładzie 18 przedstawione zostało uŝycie Apache Avalon dla klasy MerchantImpl w naszym przykładzie opisującym płatności kartami kredytowymi. Przykład 18: public class MerchantImpl implements Merchant, Serviceable { public MerchantImpl() { XmlRpc.setDriver("SAXParser"); } } public void service(servicemanager sm) throws ServiceException { this.login = sm.lookup( login ); } public Boolean authorize(string cardnumber, Double amount, String orderref) {... } 20
Pico. Wstęp do kontenerów IoC.
Pico Wstęp do kontenerów IoC Michal.Malecki@man.poznan.pl Plan prezentacji Wzorzec Inversion of Control (IoC) Wyszukiwanie zależności (Dependency Injection) PicoContainer Case Study Podsumowanie Inversion
Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
PAŃSTWOWA WYŻSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie z Seminarium Dyplomowego Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych
Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i
Program szkolenia: Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i Informacje: Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Produktywne tworzenie aplikacji webowych z
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
PHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Kontenery IoC dla Java Guice 3.0
Kontenery IoC dla Java Guice 3.0 20 maja 2014 Kamil Piętak kpietak@agh.edu.pl Agenda Przegląd implementacji kontenerów IoC Guice 3.0 Wprowadzenie pierwsze kroki Definicja zależności Rodzaje wiązań (ang.
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Spring Framework - wprowadzenie i zagadnienia zaawansowane
Program szkolenia: Spring Framework - wprowadzenie i zagadnienia zaawansowane Informacje ogólne Nazwa: Kod: Kategoria: Grupa docelowa: Czas trwania: Forma: Spring Framework - wprowadzenie i zagadnienia
Programowanie obiektowe
Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Kurs programowania. Wykład 12. Wojciech Macyna. 7 czerwca 2017
Wykład 12 7 czerwca 2017 Czym jest UML? UML składa się z dwóch podstawowych elementów: notacja: elementy graficzne, składnia języka modelowania, metamodel: definicje pojęć języka i powiazania pomiędzy
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html
Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Dr inż. Zofia Kruczkiewicz wykład 4 Programowanie aplikacji internetowych, wykład 4 1 1. Zadania aplikacji rozproszonych obiektów
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
Dokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Charakterystyka oprogramowania obiektowego
Charakterystyka oprogramowania obiektowego 1. Definicja systemu informatycznego 2. Model procesu wytwarzania oprogramowania - model cyklu Ŝycia oprogramowania 3. Wymagania 4. Problemy z podejściem nieobiektowym
Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.
Konstruktory Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasę Prostokat: class
Aplikacje RMI Lab4
Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html Lab4 Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych 1 1. Koncepcja budowy aplikacji RMI (aplikacja rozproszonych
Diagramy klas. dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com
Diagramy klas dr Jarosław Skaruz http://ii3.uph.edu.pl/~jareks jaroslaw@skaruz.com O czym będzie? Notacja Ujęcie w różnych perspektywach Prezentacja atrybutów Operacje i metody Zależności Klasy aktywne,
Czym są właściwości. Poprawne projektowanie klas
Z akcesorów get i set korzysta każdy kto programuje w C#. Stanowią one duże udogodnienie w programowaniu obiektowym. Zapewniają wygodę, bezpieczeństwo i znacząco skracają kod. Akcesory są ściśle związane
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych model systemu Wywoływanie metod zdalnych aplikacja kliencka interfejs obiekt serwer Podejście obiektowe do budowy systemów rozproszonych proxy szkielet sieć Istota podejścia
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Platformy Technologiczne
i Platformy Technologiczne Laboratorium nr 5 Java: testy jednostkowe z biblioteką JUnit Projekt opracowany w ramach laboratorium nr 5 będzie wykorzystywany w czasie laboratorium nr 6 należy zachować przygotowaną
Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C
#import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:
Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak
Java język programowania obiektowego Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 Język Java Język Java powstał w roku 1995 w firmie SUN Microsystems Java jest językiem: wysokiego
Komunikator internetowy w C#
PAŃSTWOWA WYśSZA SZKOŁA ZAWODOWA W ELBLĄGU INSTYTUT INFORMATYKI STOSOWANEJ Sprawozdanie Komunikator internetowy w C# autor: Artur Domachowski Elbląg, 2009 r. Komunikacja przy uŝyciu poczty internetowej
Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.
Adrian Skalczuk Szymon Kosarzycki Spis Treści Wstęp [1/2] Wzorce projektowe są nieodłącznym przyjacielem programisty pozwalają pisać czystszy kod, łatwiejszy do zrozumienia przez innych i zapewniają pewien
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas
Analiza i projektowanie obiektowe 2016/2017 Wykład 10: Tworzenie projektowego diagramu klas Jacek Marciniak Wydział Matematyki i Informatyki Uniwersytet im. Adama Mickiewicza 1 Plan wykładu 1. Projektowy
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
JAVA W SUPER EXPRESOWEJ PIGUŁCE
JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie
D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44
Zaawansowane aplikacje internetowe EJB 1 Rozróżniamy dwa rodzaje beanów sesyjnych: Stateless Statefull Celem tego laboratorium jest zbadanie różnic funkcjonalnych tych dwóch rodzajów beanów. Poszczególne
Programowanie Komponentowe WebAPI
Programowanie Komponentowe WebAPI dr inż. Ireneusz Szcześniak jesień 2016 roku WebAPI - interfejs webowy WebAPI to interfejs aplikacji (usługi, komponentu, serwisu) dostępnej najczęściej przez Internet,
Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski
Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski ASP.NET (2) Contexts and Dependency Injection (CDI) Specyfikacja składowa Java EE 6 dotycząca współpracy warstwy prezentacji z
Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/
Paweł Rajba pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/ Spis treści Wprowadzenie Automatyczne ładowanie klas Składowe klasy, widoczność składowych Konstruktory i tworzenie obiektów Destruktory i
Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej
Programowanie obiektowe Interfejsy Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Interfejsy Autor: Paweł Rogaliński Instytut Informatyki,
xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname="mainregion" />
1 Tworzenie Shella a. W pierwszej kolejności tworzymy nowy projekt: WPF Application. Name: Shell SolutionName: PrismApp b. Dodajemy bibliotekę PRISM za pomocą NuGet Managera (dla.net Framework 4.5 Prism
Builder (budowniczy) Cel: Przykład:
1/8 Builder (budowniczy) Cel: Oddzielenie konstruowania złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstrukcji mógł tworzyć różne reprezentacje. Przykład: 2/8 abstract class TableBuilder
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt
Wzorce projektowe. dr inż. Marcin Pietroo
Wzorce projektowe dr inż. Marcin Pietroo Wzorce projektowe Wzorzec projektowy (ang. design pattern) w inżynierii oprogramowania, rozwiązanie często pojawiających się, powtarzalnych problemów projektowych.
Wzorce logiki dziedziny
Wzorce logiki dziedziny 1. Wzorce logiki dziedziny skrypt transakcji (Transaction Script), brama tabeli (Table Data Gateway), model dziedziny (Domain model), strategia (Strategy), moduł tabeli (Table Module),
Wzorce projektowe i refaktoryzacja
Wzorce projektowe i refaktoryzacja Paweł Kozioł p.koziol@students.mimuw.edu.pl 18.01.2005 Moja praca magisterska Narzędzie dla środowiska Eclipse wspierające stosowanie wzorców projektowych J2EE Prowadzący:
Wywoływanie metod zdalnych
Wywoływanie metod zdalnych Podejście obiektowe do budowy systemów rozproszonych Wywoływanie metod zdalnych model systemu obiekt aplikacja kliencka interfejs serwer proxy szkielet sieć Istota podejścia
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
MVVM Light Toolkit. Julita Borkowska
MVVM Light Toolkit Julita Borkowska Czym jest MVVM Light Toolkit? MVVM Light Toolkit został stworzony w 2009 roku przez Laurenta Bugnion. Jest to biblioteka dostarczająca zestaw komponentów pomocnych podczas
Programowanie obiektowe
Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do
Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2
Państwowa Wyższa Szkoła Zawodowa w Tarnowie Zakład Informatyki Narzędzia i środowiska programistyczne Laboratorium 1 Wprowadzenie Prowadzący: Kierunek: Semestr: Rok: Informatyka Zimowy 2 O Sobie Od 2014
Technologie obiektowe
WYKŁAD dr inż. Paweł Jarosz Instytut Informatyki Politechnika Krakowska mail: pjarosz@pk.edu.pl LABORATORIUM dr inż. Paweł Jarosz (3 grupy) mgr inż. Piotr Szuster (3 grupy) warunki zaliczenia Obecność
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki
Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego
Podejście obiektowe do budowy systemów rozproszonych
Podejście obiektowe do budowy systemów rozproszonych interfejs (w języku Java), wywiedziony z Remote obiekt aplikacja kliencka interfejs serwer stub szkielet sieć Dariusz Wawrzyniak 1 Mechanizm RMI umożliwia
Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć
Podejście obiektowe do budowy systemów rozproszonych interfejs (w języku Java), wywiedziony z Remote obiekt aplikacja kliencka interfejs serwer stub szkielet sieć Mechanizm RMI umożliwia tworzenie obiektów
Modelowanie i Programowanie Obiektowe
Modelowanie i Programowanie Obiektowe Wykład I: Wstęp 20 październik 2012 Programowanie obiektowe Metodyka wytwarzania oprogramowania Metodyka Metodyka ustandaryzowane dla wybranego obszaru podejście do
Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć
interfejs (w języku Java), wywiedziony z Remote obiekt Podejście obiektowe do budowy systemów rozproszonych aplikacja kliencka stub interfejs serwer szkielet sieć Mechanizm RMI umożliwia tworzenie obiektów
Wprowadzenie do projektu QualitySpy
Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska
Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego Iwona Kochaoska Programowanie Obiektowe Programowanie obiektowe (ang. object-oriented programming) - metodyka tworzenia programów komputerowych,
Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton
Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Sieci VPN SSL czy IPSec?
Sieci VPN SSL czy IPSec? Powody zastosowania sieci VPN: Geograficzne rozproszenie oraz duŝa mobilność pracowników i klientów przedsiębiorstw i instytucji, Konieczność przesyłania przez Internet danych
C++ Przeładowanie operatorów i wzorce w klasach
C++ i wzorce w klasach Andrzej Przybyszewski numer albumu: 89810 14 listopada 2009 Ogólnie Przeładowanie (przeciążanie) operatorów polega na nadaniu im nowych funkcji. Przeładowanie operatora dokonuje
Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody
Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,
Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin
Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin Czym jest Spring Boot? Spring Boot jest szkieletem aplikacji, opiera się o Spring Framework czyli Framework szeroko
Forum Client - Spring in Swing
Forum Client - Spring in Swing Paweł Charkowski. 0. Cel projektu Celem projektu jest próba integracji Spring Framework z różnymi technologiami realizacji interfejsu użytkownika, oraz jej ocena. Niniejszy
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD
NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD OPIS Praca programisty oprócz umiejętności i wiedzy technicznej, wymaga również doskonałej pracy z kodem. Umiejętności te
problem w określonym kontekście siły istotę jego rozwiązania
Wzorzec projektowy Christopher Alexander: Wzorzec to sprawdzona koncepcja, która opisuje problem powtarzający się wielokrotnie w określonym kontekście, działające na niego siły, oraz podaje istotę jego
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008
Adam 1 grudnia 2008 Wstęp Opis Historia Apache kontener serwletów rozwijany w ramach projektu Apache jeden z bardziej popularnych kontenerów Web open source, Apache Software License rozwijany przez ASF
Programowanie w języku Java WYKŁAD
Programowanie w języku Java WYKŁAD dr inż. Piotr Zabawa Certyfikowany Konsultant IBM/Rational e-mail: pzabawa@pk.edu.pl www: http://www.pk.edu.pl/~pzabawa 26.05.2014 WYKŁAD 13 Refleksja Data Access Object
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie teoretyczne. Rozważana
PLAN ZARZĄDZANIA WYMAGANIAMI PROJEKT <NAZWA PROJEKTU> WERSJA <NUMER WERSJI DOKUMENTU>
Załącznik nr 4.4 do Umowy nr 35-ILGW-253-.../20.. z dnia... MINISTERSTWO FINANSÓW DEPARTAMENT INFORMATYKI PLAN ZARZĄDZANIA WYMAGANIAMI PROJEKT WERSJA numer wersji
Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl
Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki
XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.
XV. Wskaźniki 15.1. Odczytywanie adresu pamięci istniejących zmiennych Język C++ w bardzo łatwy sposób umoŝliwia nam pobieranie adresu pamięci wybranych zmiennych. Wskaźnik zajmuje zazwyczaj 4 bajty bez
Programowanie obiektowe zastosowanie języka Java SE
Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z
Zaawansowane aplikacje internetowe
Zaawansowane aplikacje internetowe EJB 1 Rozróżniamy dwa rodzaje beanów sesyjnych: Stateless Statefull Celem tego laboratorium jest zbadanie różnic funkcjonalnych tych dwóch rodzajów beanów. Poszczególne
Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania
Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania Opis biznesowy świata rzeczywistego Wymagania funkcjonalne i niefunkcjonalne aplikacji Diagram przypadków życia Diagramy klas i sekwencji:
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,
REFERAT PRACY DYPLOMOWEJ
REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i implementacja środowiska do automatyzacji przeprowadzania testów aplikacji internetowych w oparciu o metodykę Behavior Driven Development. Autor: Stepowany
Laboratorium modelowania oprogramowania w języku UML. Ćwiczenie 4 Ćwiczenia w narzędziu CASE diagram czynności. Materiały dla studenta
Zakład Elektrotechniki Teoretycznej i Informatyki Stosowanej Wydział Elektryczny, Politechnika Warszawska Laboratorium modelowania oprogramowania w języku UML Ćwiczenie 4 Ćwiczenia w narzędziu CASE diagram
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),
PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ), Program 351203 Opracowanie: Grzegorz Majda Tematyka zajęć 1. Wprowadzenie do aplikacji internetowych
Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1
Obiektowe programowanie rozproszone Java RMI Krzysztof Banaś Systemy rozproszone 1 Java RMI Mechanizm zdalnego wywołania metod Javy (RMI Remote Method Invocation) posiada kilka charakterystycznych cech,
referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.
Programowanie (język C++) referencje Wykład 2. Referencje (1) Referencja (odnośnik) jest zmienną identyfikującą inną zmienną. Wykonanie operacji na referencji ma taki sam skutek, jak wykonanie tejŝe operacji
Podstawy Programowania 2
Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu
SZKOLENIE TWORZENIE SYSTEMÓW
SZKOLENIE TWORZENIE SYSTEMÓW INFORMATYCZNYCH Z UŻYCIEM GROOVY I GRAILS KOD: JGR Strona 1 1 Opis Platforma Java EE to zbiór zaawansowanych narzędzi umożliwiających tworzenie systemów korporacyjnych. Jest
Programowanie współbieżne i rozproszone
Programowanie współbieżne i rozproszone WYKŁAD 11 dr inż. CORBA CORBA (Common Object Request Broker Architecture) standard programowania rozproszonego zaproponowany przez OMG (Object Management Group)
(Pluggable Authentication Modules). Wyjaśnienie technologii.
Bezpieczeństwo systemów komputerowych. Temat seminarium: Moduły PAM (Pluggable Authentication Modules). Wyjaśnienie technologii Autor: Bartosz Hetmański Moduły PAM (Pluggable Authentication Modules). Wyjaśnienie
Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka
1 Omówienie wzorców wykorzystywanych w Prism 5.0 Dominika Różycka Czym jest wzorzec projektowy? 2 3 Wzorzec projektowy 1. Uniwersalne i sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych