Dekorator: wzorzec projektowy na każdą bolączkę
|
|
- Arkadiusz Jóźwiak
- 8 lat temu
- Przeglądów:
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
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ół
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
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
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
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
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
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ć
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
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
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
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
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
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
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
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.
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
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ć
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
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
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 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
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ć,
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.
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
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
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
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
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
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
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
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
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.
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,
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ść
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
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
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
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
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,
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ć
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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ż.
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
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
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
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,
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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ł
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
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
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
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
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
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?
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
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),
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
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
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
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....................................................................................
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
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ć