Dekorator: wzorzec projektowy na każdą bolączkę

Wielkość: px
Rozpocząć pokaz od strony:

Download "Dekorator: wzorzec projektowy na każdą bolączkę"

Transkrypt

1 Techniki Dekorator: wzorzec projektowy na każdą bolączkę Paweł Kozłowski Stopień trudności: Nazwa wzorca projektowego dekorator jest nieco myląca, ponieważ sugeruje, że będziemy coś wzbogacać, dekorować czy upiększać. Nic bardziej błędnego! Omawiany wzorzec znajduje szerokie zastosowanie, niezależnie od tego, czy projektujemy warstwę dostępu do bazy danych, logikę biznesową lub kontroler MVC. W SIECI budowany przez nas framework Ports Pico articles/injection.html ciekawe artykuły ciekawe artykuły Jednym z najczęściej omawianych i używanych wzorców projektowych jest dekorator. Z punktu widzenia programisty ma same zalety: jest bardzo użyteczny, nieskomplikowany w implementacji i łatwy do przyswojenia. Obok singletona jest to prawdopodobnie jeden z pierwszych wzorców, z którymi stykamy się, gdy zaczynamy studiować przykłady i literaturę poświęconą zasadom projektowania. O ile jednak singleton jest obwiniany (często słusznie!) o promowanie fatalnych rozwiązań, to dokładne poznanie dekoratora przyczyniło się do powstania wielu ciekawych rozwiązań architektonicznych. Nazwa wzorca projektowego "dekorator" jest nieco myląca, ponieważ sugeruje, że będziemy coś wzbogacać, dekorować czy upiększać. Stąd może powstać błędne przeświadczenie, że mamy do czynienia z tworem przydatnym jedynie w warstwie prezentacji. Nic bardziej błędnego! Omawiany wzorzec znaj- duje szerokie zastosowanie, niezależnie od tego, czy projektujemy warstwę dostępu do bazy danych, logikę biznesową lub kontroler MVC. Jego istotą jest możliwość wzbogacenia funkcjonalności obiektów danych klas w sposób dynamiczny, bez konieczności modyfikowania oryginalnych obiektów. Definicje jak zwykle brzmią zbyt sucho, spójrzmy więc na Listing 1, gdzie Co należy wiedzieć... Przydatna będzie znajomość dwóch poprzednich artykułów z naszej serii Wzorce projektowe. Czytelnik powinien mieć wiedzę z obiektowych technik projektowania aplikacji. Co obiecujemy... Z artykułu dowiesz się, kiedy i dlaczego warto stosować wzorzec projektowy dekorator. Na przykładach pokażemy, jak stosując dekorator, bardzo łatwo i w elegancki sposób dodać nową funkcjonalność do aplikacji bez zbędnej modyfikacji kodu. 2

2 Wzorce projektowe: dekorator Techniki znajduje się elementarny przykład użycia dekoratora. W przedstawionym przypadku użyliśmy dekoratora do wzbogacenia istniejącej funkcjonalności. Nie musimy jednak zbyt ściśle sugerować się nazwą wzorca projektowego i spokojnie możemy pozwolić sobie na całkowitą zmianę funkcjonalności dekorowanego obiektu. Dwa proste przykłady, przedstawione na wspomnianych listingach, obrazują praktycznie wszystkie istotne cechy wzorca, z którym się zaznajamiamy. Szczególne istotny do odnotowania jest jeden fakt: dla klienta korzystającego z udekorowanego (często mówimy również - "opakowanego") obiektu obecność dekoratora jest zupełnie przezroczysta! Klient nie jest w stanie stwierdzić, czy korzysta z usług oryginalnego obiektu, czy też z jego udekorowanej wersji. Jest to możliwe dzięki zachowaniu przez dekorator interfejsu oryginalnego obiektu. Jeśli chcielibyśmy zapamiętać jakąś jedną zasadę czy zdanie opisujące dekoratory, mogłoby to być: Dokorator zachowuje interfejs oryginalnego obiektu i najczęściej przyjmuje dekorowany obiekt jako parametr w swoim konstruktorze. Kolejną bardzo miłą cechą dekoratora jest możliwość użycia więcej niż jednego "opakowania" dla podstawowego obiektu. Oznacza to, iż możemy składać nową funkcjonalność z wielu już istniejących elementów, bez konieczności ingerencji w raz stworzony kod. Jest to dokładnie ta sama filozofia, jaką spotykamy przy pracy z powłoką w systemach uniksowych. Doskonale wiemy, jak wiele pożytecznych operacji można wykonać, zaprzęgając do wspólnej pracy elementarne narzędzia. To samo odnosi się do dekoratorów: sprytnie łącząc wiele prostych dodatków możemy uzyskać funkcjonalność, o której nie śniło się nawet twórcom piszącym klasy czy też dekoratory (Listing 2). Zanim przejdziemy do omówienia bardziej skomplikowanych przykładów, zatrzymajmy się jeszcze na chwilę nad własnością dekoratorów, dzięki której klient nie jest w stanie rozróżnić, czy ma do czynienia z obiektem podstawowym, czy też z opakowaną jego wersją. Uważny Czytelnik zauważy, że ta nierozróżnialność jest możliwa, ponieważ pomiędzy dekoratorem i obiektem dekorowanym zachodzi taka sama relacja ("jest", Listing 1. Prosty przykład użycia dekoratora ang. IS-A), jak przy dziedziczeniu. Istotnie, przykład z Listingu 2 można by zapisać tylko i wyłącznie przy pomocy tworzenia nowych podklas (Listing 3). Jaki jest więc sens wprowadzania zupełnie nowej konstrukcji programistycznej i opisywania jej jako wzorca projektowego? Przecież to samo można uzyskać przy użyciu podstawowych konstrukcji programowania obiektowego. Jest jedna, dosyć istotna różnica pomiędzy dwoma wspomnianymi podejściami. Aby ją łatwo pokazać, przemodelujmy przykład z Listingu 2, zmieniając kolejność zastosowanych dekoratorów (Listing 4). Proszę bardzo: cała operacja była wyjątkowo prosta, odbyła się bez konieczności modyfikowania istniejącego kodu i doprowadziła do powstania nowej funkcjonalności. Niestety, w przypadku dziedziczenia mamy dużo trudniejsze zadanie: nie obędzie się bez dosyć istotnego przemeblowania napisanego kodu. Powodem jest fakt, iż formując hierarchię dziedziczenia tworzymy dość sztywne, statyczne powiązanie pomiędzy poszczególnymi klasami. W przypadku dekoratorów nie mamy takiego ograniczenia: możemy dowolnie przestawiać kolejność, dodawać nowe elementy do łańcucha i usuwać już istniejące. Takie zamiany są możliwe nie tylko w momencie ustalania struktury kodu, ale w dowolnym momencie, nawet w czasie wykonywania skryptu. Dzięki dekoratorom można uzyskać wszystkie dobrodziej- /** *interfejs, ktory może być implementowany przez wiele klas *ponieważ dekoratory również implementują ten interfejs *klient korzystający z udekorawanej klasy nie jest w stanie *rozróżnić, czy ma do czynienia z pierwotną, czy udekorowaną wersją */ interface UserDAO { public function save(user $user); public function findbyloginnamepassword($loginname, $password); class UserDAOImpl implements UserDAO { // standardowa funkcjonalność zapisywania // danych użytkowników do DB public function findbyloginnamepassword($loginname, $password){ // standardowa funkcjonalność odnajdywania // danych użytkowników po nazwie class UserDAOUpperCaseLoginDecorator implements UserDAO { private $_decorateddao; public function construct(userdao $decorateddao){ $this->_decorateddao = $decorateddao; //zadaniem dekoratora jest zapisywanie loginów //tylko wielkimi literami $user->setloginname(strtoupper($user->getloginname())); //wywołanie oryginalnej funkcjonalności $this->_decorateddao->save($user); public function findbyloginnamepassword($loginname, $password) { //implementacja wyszukiwania pozostaje bez zmian return $this->_decorateddao->findbyloginnamepassword( $loginname, $password); //konstruowanie udekorowanej wersji obiektu $dao = new UserDAOUpperCaseLoginDecorator(new UserDAOImpl()); 3

3 Techniki Wzorce projektowe: dekorator Listing 2. Łączymy dekoratory stwa dziedziczenia, ale w sposób bardziej elastyczny. Nie oznacza to oczywiście, iż namawiamy Was, by od dzisiaj nie używać dziedziczenia i pisać tylko dekoratory. Jak każdy wzorzec projektowy, dekorator nie powinien być stosowany tylko w celu otrzymania bardziej elastycznej architektury, ale w przypadkach, w których będzie naprawdę pomocny. Uzbrojeni w solidne podstawy teoretyczne możemy przyjrzeć się wreszcie przykładom pokazującym, jak w łatwy i efektywny sposób rozbudować nasze aplikacje bez konieczności modyfikacji ich podstawowego kodu. Wróćmy zatem do przykładów. Jedną z dobrych praktyk architektonicznych jest dzielenie kodu aplikacji na warstwy. W typowej aplikacji WWW, najniższą warstwę stanowi baza danych (najczęściej w postaci relacyjnej bazy danych lub zwykłych plików). Powyżej umieszczamy wartwę dostępu do danych w postaci obiektów DAO (ang. Data Access Objects). Już ta jedna wspomniana warstwa jest okazją do zaimplementowaniu wielu funkcjonalności w postaci dekoratorów. Wyobraźmy sobie, że chcemy zapisywać czas wyszukiwania danych w DB. Nic prostszego: zamiast modyfikować istniejący kod, otoczmy go dodatkową klasą (Listing 5). A może mamy DAO służące do zapisu danych użytkowników i w pewnych przypadkach chcemy szyfrować hasła. Proszę bardzo: zamiast utrzymywać dwie zbliżone wersje tego samego DAO, dużo efektywniej rozwiążemy problem stosując prosty dekorator bez modyfikowania i duplikowania istniejącego kodu. Przykłady można mnożyć również w innych warstwach sytemu. Jeśli pomyślimy o dowolnej logice biznesowej zapisującej dane, to dekoratory znajdą zastosowanie przy wersjonowaniu danych, zapisywaniu logów zmian, kontroli dostępu itd. Przesuwając się jeszcze jedną warstwę wyżej, do kontrolerów MVC, szybko odkryjemy kolejne zastosowania: śledzenie zachowań użytkowników (np. ścieżki poruszania się po serwisie WWW) czy sprawdzanie uprawnień. Zastosowania i przykłady można by mnożyć w nieskończoność. Poprzestańmy więc na stwierdzeniu, że wzorzec dekoratora jest niezwykle użyteczny i podpowiada eleganckie rozwiązania dla często spotykanych problemów związanych z dodawaniem specyficznej funkcjonalności w różnych wersjach tej samej, podstawowej aplikacji. Ta mnogość i wygoda zastosowań powoduje, że w złożonej aplikacji możemy mieć wiele dekoratorów dla jednego obiektu. Pisanie takiej ilości dekoratorów i zarządzanie ich konfiguracją stanowi wyzwanie samo w sobie. W dalszej części artykułu zastanowimy się więc, jak szybko pisać i konfigurować dekoratory. Zatrzymajmy się na dłużej nad przywołanym przykładem zastosowania dekoratorów do dodania obsługi uprawnień na poziomie warstwy kontrolerów MVC. Listing 6 pokazuje dwa przykładowe kontrolery oraz opakowanie z dekoratorów sprawdzających uprawnienia. Przedstawiony schemat dodawania obsługi uprawnień do aplikacji jest niezwykle efektywny. Po pierwsze, pozwala uruchamiać tą samą aplikację ze sprawdzaniem uprawnień i bez, w zależności od wymagań klienta. class UserDAOPasswordHashingDecorator implements UserDAO { private $_decorateddao; public function construct(userdao $decorateddao){ $this->_decorateddao = $decorateddao; //zadaniem dekoratora jest zapisywanie loginów //tylko wielkimi literami $user->setpassword(md5($user->getpassword())); //wywołanie oryginalnej funkcjonalności $this->_decorateddao->save($user); public function findbyloginnamepassword($loginname, $password) { //przy wyszukiwaniu również szyfrujemy hasła return $this->_decorateddao->findbyloginnamepassword( $loginname, md5($password)); //konstruowanie wielokrotnie udekorowanej wersji obiektu $dao = new UserDAOUpperCaseLoginDecorator(new UserDAOPasswordHashingDecorator( new UserDAOImpl())); Listing 3. Przykład z Listingu 2 zapisany przy pomocy nowych podklas class UserDAOUpperCaseLogin extends UserDAOImpl { $user->setloginname(strtoupper($user->getloginname())); parent::save($user); class UserDAOPasswordHashing extends UserDAOUpperCaseLogin { $user->setpassword(md5($user->getpassword())); parent::save($user); public function findbyloginnamepassword($loginname, $password) { return parent::findbyloginnamepassword($loginname, md5($password)); //konstruowanie wersji obiektu z dziedziczeniem $dao = new UserDAOPasswordHashing(); Listing 4. Zmieniona kolejność zastosowanych dekoratorów w stosunku do Listingu 2. Tworzymy nową funkcjonalność bez modyfikacji istniejącego kodu. $dao = new UserDAOPasswordHashingDecorator(new UserDAOUpperCaseLoginDecorator( new UserDAOImpl())); 4

4 Wzorce projektowe: dekorator Techniki Rysunek 1. Uproszczony graf obiektów w naszej aplikacji Z drugiej strony, taka architektura umożliwia niezależne pisania kodu biznesowego i odpowiedzialnego za bezpieczeństwo. Wreszcie, możemy sobie wyobrazić zastosowanie różnych silników do sprawdzania uprawnień (np. własny lub GACL). Niestety, nasze wszystkie zachwyty trochę przybledną, jeśli uświadomimy sobie, że dla każdego kontrolera trzeba stworzyć osobny dekorator. Nie jest to może wielkim problemem przy pięciu czy dziesięciu kontrolerach, ale staje się koszmarem przy dużych aplikacjach, gdzie często spotkamy setki klas typu kontroler. Nasze miny staną się jeszcze bardziej nietęgie, jeśli uświadomimy sobie, że każdy z dekoratorów będzie do siebie bardzo podobny. Ponowny rzut oka na Listing 6 faktycznie ujawnia, że w kolejnych dekoratorach różnią się tylko nazwy klas i metod zasadnicza logika pozostaje praktycznie bez zmian. Bezmyślne pisanie niemal identycznych dekoratorów nie jest zajęciem szczególnie ciekawym czy produktywnym, a dodatkowo to oczywista duplikacja kodu. Musimy więc znaleźć jakiś sposób na zautomatyzowanie żmudnego zajęcia. PHP5, jako język niezwykle dynamiczny daje nam szerokie możliwości generowania szablonowego kodu w locie. Spośród wielu opcji dwie wydają się najciekawsze: użycie magicznej metody call lub generowanie całego kodu dekoratora w czasie działania skryptu. Obie metody mają swoje wady i zalety, które za chwilę omówimy, ale najpierw spójrzmy na Listing 7, gdzie znajdują się przykładowe dekoratory (z Listingu 6), zaimplementowane przy użyciu obu wspomnianych metod. Dekorator stworzony przy pomocy call jest dosyć prosty i pozwala prezycyjnie regulować, które metody w dekoratorze są generowane automatyczne, a które ręcznie. Po prostu dla tych, które chcemy napisać sami, tworzymy kon- kretną metodą, a wprzypadku pozostałych metod polegamy na call. Omawiana właśnie metoda ma w zasadzie tylko jedną wadę w ten sposób wygenerowane dekoratory nie mogą być użyte w wywołaniach funkcji i metod, dla których określono typ argumentu (a więc dla konstrukcji $obiekt->nazwametody(typargumentu $agrument);). Jest to dość poważna wada, ponieważ na początku podkreślaliśmy, iż jedną z cech dekoratora jest zachowanie interfejsu oryginalnego obiektu. Zastosowanie call do generowania dekoratorów wyklucza silniejszą kontrolę typów, a tym samym interfejsów implementowanych przez podstawową i udekorowaną klasę. Aby obejść zidentyfikowany problem, posłużymy się prostą koncepcyjnie metodą generowaniem kodu w locie. Spójrzmy na Listing 8, gdzie pokazujemy użycie specjalnie przygotowanej biblioteki (PHPProxy, dostępnej na sourceforge.net) do generowania kodu. Jak widać, samo jej użycie jest niezwykle proste sprowadza się do zaimplementowania tylko tej logiki, która ma się znaleźć w dekoratorze nie musimy powielać ani jednego znaku kodu. Tak prosta implementacja jest możliwa dzięki istnieniu interfejsu ProxyInvocationHandler. W interfejsie tym zdefiniowana jest tylko jedna metoda invoke($method, $args). Nie trzeba być potomkiem Sherlocka Holmesa by wydedukować, że metoda ta jest uruchamiana w momencie wywoływania metod na dekoratorze, a w argumetach otrzymujemy wszystkie niezbędne informacje o wywołaniu tj. nazwę metody i jej argumenty. Korzystając z implementacji interfejsu ProxyInvocationHandler z opisywanej biblioteki (Listing 9), możemy łatwo zdecydować, czy chcemy tylko udekorować oryginalną funkcjonalność (a więc wywołać ją podczas uruchamiania dekoratora), czy też stworzyć zupełnie nowy kod: cały sekret tkwi w meto- Listing 5. Dodajemy nową funkcjonalność do zapisywania czasu wyszukiwania danych w DB class PerformanceLoggingUserDAO implements UserDAO { private $_decorateddao; private $_starttime; public function construct(userdao $decorateddao){ $this->_decorateddao = $decorateddao; $this->startmethodexecution(); $this->_decorateddao->save($user); $this->stopmethodexecution('save'); public function findbyloginnamepassword($loginname, $password) { $this->startmethodexecution(); return $this->_decorateddao->findbyloginnamepassword( $loginname, $password); $this->stopmethodexecution('findbyloginnamepassword'); private function startmethodexecution(){ $this->_starttime = microtime(); private function stopmethodexecution($methodname){ $executiontime = microtime() - $this->_starttime; echo "Wykonanie metody '$methodname' zajęło $executiontime <br>"; //konstruowanie udekorowanej wersji obiektu $dao = new PerformanceLoggingUserDAO(new UserDAOImpl()); 5

5 Techniki Wzorce projektowe: dekorator dzie getdelegate(), dzieki której możemy pobrać dekorowany obiekt i wywołać na nim dowolną metodę. Użycie biblioteki PHPProxy pozwala generować dekoratory przy minimalnym nakładzie pracy ze strony programisty i przy eliminacji powtórzeń w kodzie. Niestety, nie jest to metoda pozbawiona wad. Po pierwsze, generowanie kodu w czasie działania programu może być zbyt czasochłonne w przypadku mocno obciążonych serwisów internetowych, gdzie wydajność jest rzeczą krytyczną. Drugi, trochę mniej uciążliwy problem, związany jest z przypadłością nękająca wszystkie rozwiązania oparte o generowanie kodu. Otóż podczas wykonania programu uruchamiany jest również kod, który... nie jest nigdzie zapisany na stałe. Oznacza to, że w pewnych warunkach śledzenie wykonania programu (np. podczas wyszukiwania błędów) może być nieco utrudnione. Tak czy inaczej, mimo przedstawionych wad, jest to zdecydowanie najłatwiejsza metoda tworzenia wielu dekoratorów. Podsumujmy naszą dotychczasową wiedzę o dekoratorach. Na wstępie stwierdziliśmy, że jest to bardzo pożyteczny wzorzec, który może być stosowany praktycznie w każdej warstwie systemu. Jest to alternatywa do dziedziczenia obiektów, umożliwiająca wzbogacanie lub zmianę istniejącej funkcjonalności, bez konieczności modyfikacji raz napisanego kodu. Dekorator pada jednak trochę ofiarą własnego sukcesu mnogość jego zastosowań powoduje, że w bardziej rozbudowanej aplikacji możemy wykorzystać setki obiektów implementujących wzorzec dekoratora. Aby nie zginąć w tym gąszczu podobnych obiektów, znaleźliśmy dwie metody na dynamiczne generowanie dekoratorów. Niestety, to nie koniec problemów, które musimy rozwiązać, aby efektywnie wykorzystać dekoratory jako integralną część rozwiązania architektonicznego. Załóżmy, że Rysunek 1 przedstawia uproszczony graf obiektów w naszej aplikacji. Obiekty te są oczywiście ułożone w warstwy, natomiast obiekty są połączone między sobą siecią zależności. Już samo poprawne skonstruowanie takiej sieci obiektów może być nie lada wyzwaniem, o czym Czytelnik mógł się przekonać, śledząc mój artykuł Obiektowa linia montażowa, czyli przejrzyste Rysunek 2. Dodając dekoratory, wprowadzamy do omawianego grafu kolejny stopień skomplikowania, opakowując wybrane obiekty aplikacji j Listing 6a. Dwa przykładowe kontrolery oraz opakowanie z dekoratorów sprawdzających uprawnienia class useraction { private $_userservice; public function construct(userservice $userservice) { $this->_userservice = $userservice; public function listall(httprequest $request, ModelAndView $mv){ $users = $this->_userservice->findall(); $mv->addtomodel('users',$users); $mv->setview('userslist'); public function listwithexpensivequery( HttpRequest $request, ModelAndView $mv){ $users = $this->_userservice->finduserbyexpensivequery(); $mv->addtomodel('users',$users); $mv->setview('userslist'); public function addform(httprequest $request, ModelAndView $mv){ $mv->setview('useraddform'); public function add(httprequest $request, ModelAndView $mv){ $user = new User( $request->getparam('login'), $request->getparam('pass'), $request->getparam('firstname'), $request->getparam('lastname')); $mv->addtomodel('user',$user); try { $this->_userservice->adduser($user); $mv->setview('useraddconfirm'); catch (UserExistsException $e) { $mv->addtomodel('adduser_error','user exists!'); $mv->setview('useraddform'); class homepage { public function show(httprequest $request, ModelAndView $mv){ $mv->setview('homepage'); 6

6 Wzorce projektowe: dekorator Techniki Listing 6b. Dwa przykładowe kontrolery oraz opakowanie z dekoratorów sprawdzających // Klasa pomocnicza dla dekoratorów, gdzie odbywa się // właściwe sprawdzanie uprawnień abstract class AbstractActionSecurityDecoratorImpl { private $_decoratedaction; public function construct($decoratedaction) { $this->_decoratedaction = $decoratedaction; public function executetargetactionwithsecuritycheck( $targetaction, HttpRequest $request, ModelAndView $mv){ Rysunek 3. W Pico zawarta jest cała konfiguracja związana z połączeniami pomiędzy obiektami. Aby wprowadzić dodatkowy obiekt pośredniczący, musimy jedynie przekonfigurować połączenia. //tutaj tylko proste sprawdzanie, czy zalogowany, //ale równie łatwo zintegrować np. GACL session_start(); if ($_SESSION['user'] == null) { $mv->setview('loginform'); else { return $this->_decoratedaction->$targetaction($request, $mv); //Mimo, iż obie akcje są zupełnie inne, //to dekoratory są niemal identyczne! //Oczywista duplikacja kodu! class UserActionSecurityDecoratorImpl extends AbstractActionSecurityDecoratorImpl { public function listall(httprequest $request, ModelAndView $mv){ 'listall', $request, $mv); public function listwithexpensivequery( HttpRequest $request, ModelAndView $mv){ 'listwithexpensivequery', $request, $mv); public function addform(httprequest $request, ModelAndView $mv){ 'addform', $request, $mv); public function add(httprequest $request, ModelAndView $mv){ 'add', $request, $mv); class HomepageActionSecurityDecoratorImpl extends AbstractActionSecurityDecoratorImpl { public function show(httprequest $request, ModelAndView $mv){ 'show', $request, $mv); i elastyczne aplikacje w PHP5, z numeru 1/2006. Dodając dekoratory, wprowadzamy do omawianego grafu kolejny stopień skomplikowania, opakowując wybrane obiekty aplikacji (Rysunek 2). Warto przy tym zauważyć, że udekorowaniu będą podlegały głównie obiekty infrastrukturalne (kontrolery, DAO itd.), a nie domenowe. Musimy więc znaleźć jakiś łatwy sposób na dodanie wielu dekoratorów w całej aplikacji, bez konieczności ręcznego przebudowywania połączeń. Przy składaniu skomplikowanych grafów obiektów doskonale sprawdza się wzorzec architektoniczny IoC (ang. Inversion of Control), o którym również pisaliśmy w wyżej wspomnianym artykule. Mamy szczęście, ponieważ ten sam wzorzec również znakomicie ułatwia dodawanie dekoratorów. Dlaczego? Przypomnijmy, że w przypadku stosowania wzorca IoC bardzo pomocne są biblioteki typu kontener IoC. Te lekkie kontenery biorą na siebie cały ciężar tworzenia skomplikowanych grafów obiektów, dbając przy tym o właściwe rozwiązanie zależności pomiędzy obiektami. Kontener IoC jest więc jednym, centralnym miejscem, gdzie powoływane są do życia instancje obiektów infrastrukturalnych. Doskonale, o to nam właśnie chodziło. To scentralizowane miejsce tworzenia obiektów pozwala nam łatwo dodać nasze "opakowania". Spójrzmy na Listing 10, gdzie znajdziemy przykład wykorzystania Pico dla PHP lekkiego kontenera IoC do dodania dekoratorów do obiektów aplikacji. Jak widać, cała operacja jest stosunkowo prosta wystarczą dwie linijki kodu. Przeanalizujmy dokładniej przykład z Listingu 10. Widzimy na nim początkowo dwa współpracujące ze sobą obiekty: serwisowy i DAO. Są to obiekty infrastrukturalne, podczas dzialania aplikacji potrzebny jest zwykle tylko jeden egzemplarz takiego obiektu. W tym przypadku to Pico dba o powołanie do życia instancji obiektów oraz ich połączenie. Aby zastosować dekorator zliczający czas wykonania poszczególnych metod, musimy w jakiś sposób rozerwać ścisłe połączenie pomiędzy obiektem DAO i obiektem z DAO korzystającym. Przy klasycznym podejściu do budowy programów, gdybyśmy użyli operatora new, metod statycznych lub fabryk, mielibyśmy małe szanse na wprowadzenie trzeciego obiektu w łańcuch powią- 7

7 Techniki Wzorce projektowe: dekorator Listing 7. Dekorator (z Listingu 6), zaimplementowany przy użyciu call oraz generowanie całego kodu dekoratora w czasie działania skryptu // implementacja dekoratora z wykorzystaniem metody call class UserActionSecurityDecoratorCallImpl extends AbstractActionSecurityDecoratorImpl { public function call ($methodname, $args ) { $request = $args[0]; $mv = $args[1]; $methodname, $request, $mv); class HomepageActionSecurityDecoratorCallImpl extends AbstractActionSecurityDecoratorImpl { public function call ($methodname, $args ) { $request = $args[0]; $mv = $args[1]; $methodname, $request, $mv); Listing 8. Działanie PHPProxy do dynamicznego generowania kodu // biblioteka do dynamicznego generowania klas require_once(dirname( FILE ).'/phpproxy/src/proxygenerator.inc.php'); // wprowadzamy interfejs na fragment kodu sprawdzający uprawnienia, aby mieć // możliwość stosowania różnych sposobów i bibliotek interface SecurityChecker { function hasrightsfor(user $user, $actiontocheckrightsfor); class SecurityCheckerIsNotNull implements SecurityChecker { function hasrightsfor(user $user, $actiontocheckrightsfor){ if ($user!= null) { //tu tylko proste sprawdzanie, ale chcemy pokazać, //że kod odpowiedzialny za sprawdzanie uprawnień //jest wydzielony i może być użyty w dekoratorach return true; else { return false; // Część wspólna dla wszystkich dekoratorów. Nie ma tu duplikacji kodu jak na // Listingu 7.Cała logika związana ze sprawdzeniem uprawnień i wyowołaniem // (lub nie) dekoratora zamknięta jest w tej jednej klasie class SecurityCheckerMethodInvImpl extends DelegatingInvocationHandler { private $_securitychecker; private $_decoratedaction; public function construct(securitychecker $securitychecker) { $this->_securitychecker = $securitychecker; public function invoke($method, $args) { $request = $args[0]; $mv = $args[1]; $user = getloggedinuser(); if ($this->_securitychecker($user, $method)){ return parent::invoke($method, $args); else { $mv->setview('loginform'); public function getloggedinuser(){ session_start(); return $_SESSION['user']; $proxygenerator = new ProxyClassGenerator(); $securemethodinvocation = new SecurityCheckerMethodInvImpl( new SecurityCheckerIsNotNull()); // dynamiczne wygenerowanie dowolnego dekoratora sprowadza się do jednej linii // kodu! $useractiondecorated = $proxygenerator->getproxy( 'useraction', $securemethodinvocation); $homepagedecorated = $proxygenerator->getproxy( 'homepage', $securemethodinvocation); zań. W przypadku kontenera IoC sprawa jest o wiele prostsza, ponieważ w Pico zawarta jest cała konfiguracja związana z połączeniami pomiędzy obiektami. Jedyne, co musimy zrobić, to przekonfigurować te połączenia w taki sposób, by wprowadzić dodatkowy obiekt pośredniczący (Rysunek 3). W Pico robimy to przy pomocy parametrów komponentu, tak jak pokazaliśmy w drugiej części Listingu 10. Oczywiście pokazany sposób można wykorzystać do użycia więcej niż jednego dekoratora (Listing 11). Kontenery IoC w znaczący sposób ułatwiają stosowanie dekoratorów w złożonych aplikacjach. Dzieki nim możemy w jednym, centralnym miejscu, skonfigurować połączenia między obiektami i tym samym dodać nowy element do takiego połączenia. Sposób jest dość prosty i nie wymaga zmian w kodzie PHP jedynie w konfiguracji kontenera IoC. Listing 9. Korzystając z implementacji interfejsu ProxyInvocationHandler z opisywanej biblioteki możemy łatwo zdecydować, czy chcemy tylko udekorować oryginalną funkcjonalność, czy też stworzyć zupełnie nowy kod interface ProxyInvocationHandler { public function invoke($method, $args); class DelegatingInvocationHandler implements ProxyInvocationHandler { private $_delegate = null; public function construct( $delegate){ $this->_delegate = $delegate; public function invoke( $method, $args){ $reflectionclass = new ReflectionClass( get_class($this-> getdelegate())); $reflectionmethod = $reflectionclass-> getmethod($method); return $reflectionmethod-> invokeargs( $this->getdelegate(),$args); public function getdelegate(){ return $this->_delegate; 8

8 Wzorce projektowe: dekorator Techniki Listing 10. Przykład wykorzystania Pico dla PHP lekkiego kontenera IoC do dodania dekoratorów do obiektów aplikacji $parentpico = new DefaultPicoContainer(); $parentpico->regcomponentimpl('frontcontroller', 'FrontControllerImpl'); $parentpico->regcomponentimpl( 'ActionResolvingStrategy', //componentkey 'PicoActionResolvingStrategy', //componentclass array ('paramname' => 'action') ); $parentpico->regcomponentimplwithincfilename( dirname( FILE ).'/lib/smartyviewresolver.php', 'ViewResolvingStrategy', 'SmartyViewResolvingStrategy', array ( array('compile_dir' => dirname( FILE ).'/work/templates_c'), 'file:'.dirname( FILE ).'/templates/smarty/', '.tpl') ); $pico = new DefaultPicoContainer(null, $parentpico); $pico->regcomponentinstance($pico, 'PicoContainer'); '/../shared/model/model.inc.php','userservice','userserviceimpl'); '/../shared/model/model.inc.php','userdao','userdaopdoimpl'); $pico->regcomponentimpl('pdo','pdopicoadapter',array ( 'pgsql:dbname=ditalkdb;host=localhost', 'postgres', 'postgres')); //actions '/actions/loginaction_action.php','loginaction','loginaction'); '/actions/useraction_action.php','useractiontarget', 'useraction'); $pico->regcomponentimpl('useraction', 'UserActionSecurityDecoratorImpl', array ('decoratedaction' => new BasicComponentParameter('useractionTarget'))); '/actions/homepage_action.php','homepagetarget','homepage'); $pico->regcomponentimpl('homepage', 'HomepageActionSecurityDecoratorImpl', array ('decoratedaction' => new BasicComponentParameter('homepageTarget'))); $fc = $pico->getcomponentinstance('frontcontroller'); $fc->doservice(new HttpRequest()); Rozwiązanie jest prawie idealne. Prawie, bo w dalszym ciągu dla każdego dekoratora trzeba dodać nowy wpis w konfiguracji i zmodyfikować połączenia między obiektami. Dla twórczo lewniwego programisty to zdecydowanie zbyt duży wysiłek. Jeśli pomyślimy całościowo o stylu programowania, w którym napisany został Listing 10, to powinna nasunąć się Listing 11. Przykład rozwiązania, które nie skazuje nas na żmudne deklarowanie pojedynczych dekoratorów //rejestracja poprzednich komponentów //jak na Listingu 10 '/actions/useraction_action.php','useraction', 'useraction'); '/actions/homepage_action.php','homepage','homepage'); '/actions/loginaction_action.php','loginaction','loginaction'); //security decorators $pico->regcomponentimpl('securitymethodinterceptor'); $pico->registeraspect(new Aspect(new RegExpNameMatchingPointcut( '/^[a-km-z]+action$/'),new MatchingAllPointcut(), 'SecurityMethodInterceptor')); nam pewna refleksja. Otóż w opisywanym przypadku stosujemy dekoratory do globalnych zmian w całej aplikacji. Patrzymy na działające skrypty i myślimy: teraz chcielibyśmy dodać logowanie do wszystkich obiektów DAO, żeby zobaczyć, gdzie jest wąskie gardło wydajnościowe, albo: teraz udekorujmy wszystkie kontrolery, żeby sprawdzać uprawnienia. Niestety, wypracowana do tej pory metoda skazuje nas na żmudne deklarowanie pojedynczych dekoratorów. Gdyby tylko istniała konstrukcja programistyczna, pozwalająca łatwo wyrazić żądania typu: obiekty określonego typu udekoruj danym kodem, moglibyśmy dosłownie w kilku linijkach kodu wprowadzić do aplikacji logowanie czy sprawdzanie uprawnień. Zupełnie niezależnie od ilości obiektów do udekorowania. Na pocieszenie chcemy powiedzieć, że takie metody już powstają (przykładowy Listing 11)! Jest to idea bardzo zbliżona do programowania aspektowego (ang. Aspect Oriented Programming), ale to już temat na zupełnie inny artykuł. Podsumowanie W artykule pokazaliśmy, że dekorator jest prostym i niezwykle pożytecznym wzorcem projektowym. Jest tak użyteczny, że w pewnym momencie możemy mieć ochotę zastosować go na bardzo szeroką skalę. Aby jednak zrobić to efektywnie, musimy zadbać o rozwiązanie dwóch problemów: automatycznego generowania dekoratorów oraz ich konfiguracji w całej aplikacji. Z pierwszym problem doskonale poradzimy sobie dynamicznie generując powtarzalny kod dekoratora. Zastosowanie kontenera IoC wpłynie dodatnio na architekturę naszej aplikacji i umożliwi łatwe konfigurowanie dekoratorów. Jeśli zrozumiemy i opanujemy przedstawione powyżej triki, świat programowania aspektowego nie będzie miał przed nami tajemnic. O autorze: Paweł Kozłowski jest pracownikiem SU- PERMEDIA, gdzie od roku 2000 projektuje i tworzy złożone aplikacje WWW w PHP. Obecnie zajmuje się rozwijaniem frameworków i bibliotek ORM opartych na PHP5. Jest autorem portu PicoContainer dla PHP5 i wielu publikacji poświęconych PHP. Kontakt: pkozlowski@phpsolmag.org 9

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

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ół

Bardziej szczegółowo

Rozwiązywanie problemów przekrojowych z użyciem IoC

Rozwiązywanie problemów przekrojowych z użyciem IoC Dla zaawansowanych Rozwiązywanie problemów przekrojowych z użyciem IoC Piotr Szarwas Stopień trudności: W każdej aplikacji podzielonej na warstwy występują elementy, których nie można przypisać do żadnej

Bardziej szczegółowo

PHP 5 język obiektowy

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

Bardziej szczegółowo

Kurs WWW. Paweł Rajba. pawel@ii.uni.wroc.pl http://pawel.ii.uni.wroc.pl/

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

Bardziej szczegółowo

Przykładowa implementacja

Przykładowa implementacja Wzorce projektowe, cz. 10 Facade Fasada służy do ujednolicenia dostępu do złożonego systemu poprzez udostępnienie uproszczonego i uporządkowanego interfejsu programistycznego. Fasada zwykle implementowana

Bardziej szczegółowo

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

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

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

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ć

Bardziej szczegółowo

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji). Dekoratory są w miarę ezoteryczną cechą Pythona w przeciwieństwie do funkcji, klas czy iteratorów nie są powszechną cechą języków programowania. Niemniej, warto je omówić mimo wszystko, gdyż są niezwykle

Bardziej szczegółowo

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce projektowe. dr inż. Marcin Pietroo Wzorce projektowe dr inż. Marcin Pietroo Adapter - strukturalny wzorzec projektowy, którego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach - adapter przekształca interfejs

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

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

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

10. Programowanie obiektowe w PHP5

10. Programowanie obiektowe w PHP5 Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE

Bardziej szczegółowo

Czym są właściwości. Poprawne projektowanie klas

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

Bardziej szczegółowo

Wprowadzenie do programowania aplikacji mobilnych

Wprowadzenie do programowania aplikacji mobilnych Wprowadzenie do programowania aplikacji mobilnych dr Przemysław Juszczuk dr Przemysław Juszczuk Trochę historii Idea wzorców projektowych wywodzi się jeszcze z wczesnych lat osiemdziesiątych ubiegłego

Bardziej szczegółowo

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.

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

Bardziej szczegółowo

Programowanie zorientowane obiektowo. Mateusz Kołecki

Programowanie zorientowane obiektowo. Mateusz Kołecki Programowanie zorientowane obiektowo Mateusz Kołecki Plan MVC Wstęp Separacja odpowiedzialnośći Antyprzykład Dobry przykład Wady/zalety MVC MVC to tylko początek - wzorce projektowe Dlaczego chcemy używać

Bardziej szczegółowo

Programowanie obiektowe - 1.

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

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

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

Bardziej szczegółowo

Klasy abstrakcyjne i interfejsy

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

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 11 - przegląd wybranych wzorców mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 24 maja 2017 1 / 38 mgr inż. Krzysztof Szwarc Programowanie obiektowe Wzorce

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

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ć,

Bardziej szczegółowo

Wzorce projektowe. dr inż. Marcin Pietroo

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.

Bardziej szczegółowo

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. 1/8 Singleton Cel: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej. Przykład: Niekiedy ważne jest, aby tworzyć tylko jedną instancję jakiejś klasy. Globalne zmienne

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Wykład 12 Marcin Młotkowski 16 maja 2018 Plan wykładu 1 Analiza obiektowa Dziedziczenie Dziedziczenie a składanie 2 Marcin Młotkowski 482 / 537 Dziedziczenie Dziedziczenie a składanie Plan wykładu 1 Analiza

Bardziej szczegółowo

Technologia Programowania 2016/2017 Wykład 4

Technologia Programowania 2016/2017 Wykład 4 Technologia Programowania 2016/2017 Wykład 4 Wzorce projektowe GoF Jakub Lemiesz Wzorce GRASP a wzorce GoF Znamy 9 wzorców GRASP ogólne zasady Na GRASP opierają się klasyczne wzorce GoF Na wzorcach GoF

Bardziej szczegółowo

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Co dziś będziemy robić Uwierzytelnianie użytkowników, Obiekt session, Silniki

Bardziej szczegółowo

Wyrażenie wewnątrz nawiasów jest atomem (rozpatrujemy je jako całość).

Wyrażenie wewnątrz nawiasów jest atomem (rozpatrujemy je jako całość). Wyrażenia regularne pełnią istotną rolę w PHP. Umożliwiają one opisywanie i przetwarzanie długich ciągów znaków. Dzieje się to na zasadzie porównania danego ciągu znaków z określonym wzorem, ułożonym przez

Bardziej szczegółowo

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Projektowanie obiektowe. Roman Simiński  Wzorce projektowe Wybrane wzorce strukturalne Projektowanie obiektowe Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wzorce projektowe Wybrane wzorce strukturalne Fasada Facade Pattern 2 Wzorzec Fasada Facade Pattern koncepcja 3 Wzorzec

Bardziej szczegółowo

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Plik pobrano z   Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja: Wzorce projektowe, cz. 2 Strategy Druga część z serii wpisów o wzorcach projektowych. Dziś omówię wzorzec Strategii (Strategy). Wstęp Strategia jest wzorcem projektowym, który definiuje rodzinę wymiennych

Bardziej szczegółowo

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób? Problemy projektowania obiektowego Czy podobne problemy można rozwiązywac w podobny sposób? Czy te problemy można przedstawić w abstrakcyjny sposób, tak aby były pomocne w tworzeniu rozwiązań w różnych

Bardziej szczegółowo

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016 Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016 Repository dodatkowa warstwa abstrakcji na obiektową warstwę dostępu do danych.

Bardziej szczegółowo

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka Sesje, ciasteczka, wyjątki Nie sposób wyobrazić sobie bez nich takich podstawowych zastosowań, jak logowanie użytkowników czy funkcjonowanie koszyka na zakupy. Oprócz tego dowiesz się, czym są wyjątki,

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Metody statyczne i klasowe Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk (Wydział Fizyki) PO w. VI Jesień 2013 1 / 23 W poprzednich odcinkach... Klasy kategorie obiektów Przynależność

Bardziej szczegółowo

Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny

Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny Technologie Internetowe Raport z wykonanego projektu Temat: Internetowy sklep elektroniczny AiRIII gr. 2TI sekcja 1 Autorzy: Tomasz Bizon Józef Wawrzyczek 2 1. Wstęp Celem projektu było stworzenie sklepu

Bardziej szczegółowo

MVVM Light Toolkit. Julita Borkowska

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

Bardziej szczegółowo

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

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

Bardziej szczegółowo

Dokumentacja do API Javy.

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

Bardziej szczegółowo

Wprowadzenie do Doctrine ORM

Wprowadzenie do Doctrine ORM Wprowadzenie do Doctrine ORM Przygotowanie środowiska Do wykonania ćwiczenia konieczne będzie zainstalowanie narzędzia Composer i odpowiednie skonfigurowanie Netbeans (Tools->Options->Framework & Tools->Composer,

Bardziej szczegółowo

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013 Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (2) Wykład 10 Inversion of Control Wiktor Zychla 2013 1 Dependency Injection Dependency Injection = zestaw technik pozwalających tworzyć

Bardziej szczegółowo

Decorator (dekorator)

Decorator (dekorator) 1/10 Decorator (dekorator) Cel: Dołącza dynamicznie nową funkcjonalność do obiektu elastyczna alternatywa dziedziczenia. Przykład: interface iplik { void zapisz(string tekst); String odczytaj(); class

Bardziej szczegółowo

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne Baza danych sql 1. Wprowadzenie Do tej pory operowaliście na listach. W tej instrukcji pokazane zostanie jak stworzyć bazę danych. W zadaniu skorzystamy z możliwości utworzenia struktury bazy danych z

Bardziej szczegółowo

Z pojedynczym obiekcie zasady grupy znajdziemy dwa główne typy ustawień:

Z pojedynczym obiekcie zasady grupy znajdziemy dwa główne typy ustawień: Zasady grupy (GPO) Windows Server 2008 R2 Zasady grupy to potężne narzędzie udostępnione administratorom systemów Windows w celu łatwiejszego zarządzania ustawieniami stacji roboczych. Wyobraźmy sobie

Bardziej szczegółowo

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

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

Bardziej szczegółowo

Webowy generator wykresów wykorzystujący program gnuplot

Webowy generator wykresów wykorzystujący program gnuplot Uniwersytet Mikołaja Kopernika Wydział Fizyki, Astronomii i Informatyki Stosowanej Marcin Nowak nr albumu: 254118 Praca inżynierska na kierunku informatyka stosowana Webowy generator wykresów wykorzystujący

Bardziej szczegółowo

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe. Warstwa integracji wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe. 1. Ukrycie logiki dostępu do danych w osobnej warstwie 2. Oddzielenie mechanizmów trwałości od modelu obiektowego Pięciowarstwowy

Bardziej szczegółowo

C++ Przeładowanie operatorów i wzorce w klasach

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

Bardziej szczegółowo

Programowanie obiektowe

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.

Bardziej szczegółowo

Spring Framework - wprowadzenie i zagadnienia zaawansowane

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

Bardziej szczegółowo

Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne

Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne Wprowadzenie niektórych zagadnień OOP oraz wzorce operacyjne ŁUKASZ KIEŁCZYKOWSKI 1 1. Wprowadzenie Wyobraźmy sobie, że jesteśmy firmą tworzącą oprogramowanie i dostaliśmy właśnie zlecenie na stworzenie

Bardziej szczegółowo

problem w określonym kontekście siły istotę jego rozwiązania

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

Bardziej szczegółowo

Grzegorz Ruciński. Warszawska Wyższa Szkoła Informatyki 2011. Promotor dr inż. Paweł Figat

Grzegorz Ruciński. Warszawska Wyższa Szkoła Informatyki 2011. Promotor dr inż. Paweł Figat Grzegorz Ruciński Warszawska Wyższa Szkoła Informatyki 2011 Promotor dr inż. Paweł Figat Cel i hipoteza pracy Wprowadzenie do tematu Przedstawienie porównywanych rozwiązań Przedstawienie zalet i wad porównywanych

Bardziej szczegółowo

Modele danych walidacja widoki zorientowane na model

Modele danych walidacja widoki zorientowane na model Modele danych walidacja widoki zorientowane na model 1. Wprowadzenie Modele danych Modele danych w ASP.NET MVC to klasy znajdujące się w katalogu Models. Ich zadaniem jest mapowanie danych przesyłanych

Bardziej szczegółowo

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. 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

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 7 Marcin Młotkowski 8 kwietnia 2015 Plan wykładu Z życia programisty, część 1 1 Z życia programisty, część 1 2 3 Z życia programisty, część 2 Model View Controller MVC w

Bardziej szczegółowo

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf Materiały poprawione Rozwiązanie zadania w NetBeans IDE 7.4: Jarosław Ksybek, Adam Miazio Celem ćwiczenia jest przygotowanie prostej aplikacji

Bardziej szczegółowo

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Bardziej szczegółowo

Programowanie obiektowe

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

Bardziej szczegółowo

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04

Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych kolekcji. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych

Bardziej szczegółowo

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 ), 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

Bardziej szczegółowo

Wykład 8: klasy cz. 4

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

Bardziej szczegółowo

Modelowanie obiektowe

Modelowanie obiektowe Modelowanie obiektowe ZPO 2018/2019 Dr inż. W. Cichalewski Materiały wykonane przez W. Tylman Diagramy klas Diagramy klas Zawiera informacje o statycznych związkach między elementami (klasami) Są ściśle

Bardziej szczegółowo

Programowanie w języku Java WYKŁAD

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

Bardziej szczegółowo

Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor

Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor Koszalin, 15.06.2012 r. Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor Zespół projektowy: Daniel Czyczyn-Egird Wojciech Gołuchowski Michał Durkowski Kamil Gawroński Prowadzący: Dr inż.

Bardziej szczegółowo

Pico. Wstęp do kontenerów IoC.

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

Bardziej szczegółowo

Backend Administratora

Backend Administratora Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona

Bardziej szczegółowo

Aplikacje RMI https://docs.oracle.com/javase/tutorial/rmi/overview.html

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

Bardziej szczegółowo

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty

TECHNOLOGIE INTERNETOWE WYKŁAD 6. JavaScript Funkcje i obiekty 1. Co to jest funkcja? Funkcja jest oddzielnym blokiem kodu, który może być wielokrotnie wykonywany w danym programie, poprzez jej wielokrotne wywoływanie. Do funkcji przekazujemy przeważnie jakieś argumenty,

Bardziej szczegółowo

Programowanie obiektowe

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

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

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

Bardziej szczegółowo

media Blitz wydajne sytemy szablonów

media Blitz wydajne sytemy szablonów Blitz wydajne sytemy szablonów Dlaczego stosować szablony? MVC Kontroler Model Widok Co to jest Blitz? Rozszerzenie PHP stworzone przez Alexey A. Rybak a. Regularnie rozwijany od 2005 roku. Szybki i lekki

Bardziej szczegółowo

Aplikacje w środowisku Java

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

Bardziej szczegółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

Bardziej szczegółowo

Słowa kluczowe jak góry lodowe

Słowa kluczowe jak góry lodowe Public Słowa kluczowe jak góry lodowe czyli rzecz o bibliotekach testowych Marcin Kowalczyk marcin.kowalczyk@tieto.com Spis treści Dlaczego słowa kluczowe są jak góry lodowe, po co tworzyć własne biblioteki

Bardziej szczegółowo

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi. Ekspert radzi mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8 Spis treści 1. Zarys rozwiązania...3 1.2 Case study...3 1.3 Wymagania...3 2. Projekt...3

Bardziej szczegółowo

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Bardziej szczegółowo

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

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

Bardziej szczegółowo

Programowanie obiektowe

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.

Bardziej szczegółowo

Przyspieszenie obróbki CNC z edytorem ścieżki. narzędzia w ZW3D. ZW3D CAD/CAM Biała księga

Przyspieszenie obróbki CNC z edytorem ścieżki. narzędzia w ZW3D. ZW3D CAD/CAM Biała księga Przyspieszenie obróbki CNC z edytorem ścieżki narzędzia w ZW3D Wstęp Podczas procesu obróbki, dobrze wykonane części zawsze wymagają doskonałych umiejętności wytwarzania i doświadczenia. Czy zdarzyło ci

Bardziej szczegółowo

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których

Bardziej szczegółowo

Zaawansowane programowanie w C++ (PCP)

Zaawansowane programowanie w C++ (PCP) Zaawansowane programowanie w C++ (PCP) Wykład 4 - wzorce projektowe. dr inż. Robert Nowak - p. 1/18 Powtórzenie klasy autonomiczne tworzenie nowych typów: dziedziczenie i agregacja dziedziczenie: przedefiniowywanie

Bardziej szczegółowo

Podstawy Programowania Obiektowego

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

Bardziej szczegółowo

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Spis treści Wprowadzenie...n...n... 5 Jak korzystać z tej książki?...t... 6 Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C++... 7 Podsumowanie...t...t...15 Rozdział 2. Rozdział

Bardziej szczegółowo

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki Programowanie w Sieci Internet Blok 2 - PHP Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki Co dziś będziemy robić Podstawy podstaw, czyli małe wprowadzenie do PHP, Podstawy

Bardziej szczegółowo

Kurs programowania. Wykład 12. Wojciech Macyna. 7 czerwca 2017

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

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy Pojęcie klasy Program napisany w języku Java składa się ze zbioru klas. Każda klasa zawiera

Bardziej szczegółowo

Web frameworks do budowy aplikacji zgodnych z J2EE

Web frameworks do budowy aplikacji zgodnych z J2EE Web frameworks do budowy aplikacji zgodnych z J2EE Jacek Panachida promotor: dr Dariusz Król Przypomnienie Celem pracy jest porównanie wybranych szkieletów programistycznych o otwartym kodzie źródłowym

Bardziej szczegółowo

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów)

Projektowanie obiektowe Wzorce projektowe. Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów) Projektowanie obiektowe Wzorce projektowe Gang of Four Strukturalne wzorce projektowe (Wzorce interfejsów) 1 Roadmap Adapter Bridge Composite Facade 2 Pojęcia obiekt interfejs typ klasa 3 Co to jest delegacja?

Bardziej szczegółowo

programowanie w oparciu o platformę netbeans w praktyce

programowanie w oparciu o platformę netbeans w praktyce programowanie w oparciu o platformę netbeans w praktyce Adam Kędziora. Netbeans innovators grants. Mechanizm lookup jako panorama firm. Węzły w netbeans. Mechanizm lookup jako torba z narzędziami. Dwa

Bardziej szczegółowo

Wzorce logiki dziedziny

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),

Bardziej szczegółowo

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007 Symulacja samochodu z kamerą stereowizyjną Krzysztof Sykuła 15 czerwca 2007 1 1 Opis wykonanego projektu Symulacja samochodu z kamerą stereowizyjną była pretekstem do napisania Engine u 3D, wykorzystującego

Bardziej szczegółowo

Programowanie MorphX Ax

Programowanie MorphX Ax Administrowanie Czym jest system ERP? do systemu Dynamics Ax Obsługa systemu Dynamics Ax Wyszukiwanie informacji, filtrowanie, sortowanie rekordów IntelliMorph : ukrywanie i pokazywanie ukrytych kolumn

Bardziej szczegółowo

Builder (budowniczy) Cel: Przykład:

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

Bardziej szczegółowo

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków mgr inż. Maciej Lasota Version 1.0, 13-05-2017 Spis treści Wyjątki....................................................................................

Bardziej szczegółowo

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

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

Bardziej szczegółowo

W dowolnym momencie można zmienić typ wskaźnika.

W dowolnym momencie można zmienić typ wskaźnika. c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać

Bardziej szczegółowo