Programowanie zorientowane obiektowo. Mateusz Kołecki

Podobne dokumenty
Programowanie obiektowe

Programowanie Zespołowe

MVC w praktyce tworzymy system artykułów. cz. 1

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce projektowe cz. I. Wzorce projektowe cz. I 1/33

Wzorce projektowe Michał Węgorek

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Projektowanie oprogramowania: wzorce architektoniczne i projektowe

Zaawansowane programowanie obiektowe - wykład 5

Zaawansowane programowanie w C++ (PCP)

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

Program szkolenia: Wzorce projektowe w C++

Wzorce prezentacji internetowych

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

(wybrane) Wzorce projektowe. Programowanie Obiektowe Mateusz Cicheński

Projektowanie i architektura frameworka w języku PHP. Tomasz P.F. Kowalczyk

Wprowadzenie do programowania aplikacji mobilnych

Podstawy programowania III WYKŁAD 6

Technologia Programowania 2016/2017 Wykład 5

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

Technologia Programowania 2016/2017 Wykład 4

MVC w praktyce tworzymy system artykułów. cz. 2

Przykładowa implementacja

Wykład 4. Projektowanie. MIS n Inżynieria oprogramowania Październik 2014

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Wzorce logiki dziedziny

Wzorce projektowe. dr Jarosław Skaruz

Kurs WWW. Paweł Rajba.

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

PHP 5 język obiektowy

Wstęp. Ale po co? Implementacja

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

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

Wprowadzenie do framework a Symfony

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

Wzorce projektowe / Eric Freeman [et al.]. Gliwice, cop Spis treści

Wzorce projektowe w aplikacjach webowych

Programowanie obiektowe

Zasady projektowania obiektowego

Programowanie komponentowe 5


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

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

PROJEKTOWANIE APLIKACJI INTERNETOWYCH

Wzorce dystrybucji i wspólbieżności autonomicznej

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Wzorce projektowe ArrayList. Aplikacja i zdarzenia. Paweł Chodkiewicz

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Cache przeglądarki internetowej

Różne odmiany budowniczego. Po co używać wzorca budowniczy? Kiedy używać budowniczego

Programowanie w języku Java WYKŁAD

Projektowanie Graficznych Interfejsów Użytkownika. Robert Szmurło

Java: interfejsy i klasy wewnętrzne

Szczególne problemy projektowania aplikacji internetowych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Testowanie oprogramowania Wzorce projektowe

Program szkolenia: Wzorce projektowe i architektoniczne oraz efektywne techniki Object Oriented Design dla projektantów systemów

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

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

Portal społecznościowy PastExplorer

Projektowanie aplikacji JEE z użyciem wzorców projektowych i notacji UML

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wzorce projektowe. dr inż. Marcin Pietroo

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Programowanie obiektowe

Programowanie i projektowanie obiektowe

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

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

NoSQL Not Only SQL: CouchDB. I.Wojnicki, NoSQL. Apache CouchDB has started. Time to relax. Przetwarzanie dokumentów i widoków.

Programowanie obiektowe

Metodyki zwinne wytwarzania oprogramowania

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Projektowanie obiektowe oprogramowania Wykład 4 - SOLID GRASP Wiktor Zychla 2012

I.Wojnicki, Tech.Inter.

Adaptywny kod : zwinne programowanie, wzorce projektowe i SOLID-ne zasady / Gary McLean Hall. Gliwice, cop Spis treści

PHP zaawansowane programowanie

Technologia Programowania 2016/2017 Wykład 6

Budowanie aplikacji biznesowych przy użyciu. Presentation Foundation i wzorca MVVM

prepared by: Programowanie WWW Servlety

REFERAT O PRACY DYPLOMOWEJ

NoSQL Not Only SQL, CouchDB. I.Wojnicki, NoSQL. Apache CouchDB has started. Time to relax. Igor Wojnicki

Enkapsulacja, dziedziczenie, polimorfizm

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Projektowanie obiektowe Wzorce projektowe. Wprowadzenie do wzorców projektowych

Wzorce projektowe. dr inż. Marcin Pietroo

Projektowanie obiektowe Wzorce projektowe

Technologie internetowe ASP.NET Core. Paweł Rajba

Programowanie obiektowe

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wzorce oprogramowania Gof (cd) zastosowane w modelu obiektowym

Zaawansowany kurs języka Python

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Transkrypt:

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ć wzorców? Wzorzec Strategia - omówienie i przykład Inne wzorce Krótko o SOLID

HTTP/1.1 200 OK Content-Type: text/html Transfer-Encoding: chunked Dekoduję warstwa danych/logika biznesowa M Model żądanie HTTP Wybieram model warstwa prezentacji View V <html> <?php <?php <body> Wybieram Widok $response = $response; Controller </body> sterowanie C return aplikacją $this->render('profile.php', array( <?php </html> $user = $this->usersrepo ->getone(123); 'user' => $user GET /users/123 HTTP/1.1 )); Kontroler Model Widok

Separacja odpowiedzialności Kontroler Model Widok

Kontroler przyjmuje dane wejściowe od użytkownika reaguje na akcje użytkownika zarządza zmiany w modelu decyduje, który widok wyświetlić

Model logika biznesowa składowanie danych modyfikacja danych

Widok prezentacja danych z modelu

Antyprzykład <?php /* admin/panel.php */ $user = UsersTable::getInstance()->getOne( "SELECT * FROM users WHERE id={$_session['uid']" ); if (!$user!$user->isadmin) { header('location: /admin/logout?go=%2fadmin%2flogin'); exit;?> <html> <!--... --> <h1>admin panel</h1> <div class="admin-info">login: <?= $user->login?></div> <!--... --> </html>

Przykład (model) <?php /* lib/entities/userentity.php */ class UserEntity extends AbstractEntity { protected $login; protected $password; protected $isadmin; public static function create(array $data) { /*... */ public function getlogin() { /*... */ public function setlogin() { /*... */ public function checkpassword($password) { /*... */ public function setpassword($password, $salt = null) { /*... */ public function isadmin() { /*... */ public function setisadmin($bool) { /*... */

Przykład (model) cd. <?php /* lib/repositories/users.php */ class Users extends AbstractRepository implements UsersRepositoryInterface { /*... */ public function getone($id) { $user = $this->db->findone( 'SELECT * FROM users WHERE id=:id', array(':id' => (int)$id) ); if ($user === false) { return false; return UserEntity::create($user);

Przykład (widoki) <?php /* views/admin/panel.php */ $this->extend('layouts/admin.php');?> <div class="admin-info"> Login: <?= $this->user->login?> </div> <!--... --> <?php /* views/layouts/admin.php */?> <html> <!--... --> <body> <?= $this->content?> </body> </html>

Przykład (kontroler) <?php /* controllers/admincontroller.php */ class AdminController extends AbstractController { protected $usersrepo; protected $session; public function construct( UsersRepositoryInterface $usersrepo, SessionInterface $session, ) { $this->usersrepo = $usersrepo; $this->session = $session; /*... */

Przykład (kontroler) cd. <?php /* controllers/admincontroller.php */ class AdminController extends AbstractController { /*... */ public function indexaction() { $uid = $this->session->get('logged-in-user-id'); $user = $this->usersrepo->getone($uid); if (!$user $user->isadmin()) { $url = $this->url('/admin/logout', ['go' => '/admin/login']) return $this->redirect($url); return $this->render('admin/panel.php', array('user' => $user));

Antyprzykład <?php /* admin/panel.php */ $user = UsersTable::getInstance()->getOne( "SELECT * FROM users WHERE id={$_session['uid']" ); if (!$user!$user->isadmin) { header('location: /admin/logout?go=%2fadmin%2flogin'); exit;?> <html> <!--... --> <h1>admin panel</h1> <div class="admin-info">login: <?= $user->login?></div> <!--... --> </html>

Wady: większy poziom skomplikowania narzut kosztowne zmiany modelu pociągają za sobą zmiany widoków Korzyści: jasno podzielone odpowiedzialności łatwiejsze utrzymanie dużych projektów możliwość wymiany elementów aplikacji łatwiejsze testowanie elementów większa swoboda zarządzania pracą zespołu

Połowa za nami. Pytania?

Wzorce projektowe Dlaczego chcemy ich używać? Sprawdzone i uniwersalne rozwiązania powtarzających się problemów. Czym różnią się wzorce projektowe od frameworków? Wzorce są bardziej ogólne i abstrakcyjne. Bardziej nadają się do ponownego wykorzystania i są bardziej elastyczne.

Wzorce projektowe Czym nie są? implementacją

Przykład wzorca projektowego Strategia

Strategia Jedno zadanie a wymienne implementacje zadania Przykład: Różne strategie (algorytmy) służące do sortowania Różne strategie (mechanizmy) służące do keszowania

Strategia Kontekst «Interfejs» Strategia +zrobto() KonkretnaStrategiaA +zrobto() KonkretnaStrategiaB +zrobto()

Strategia DojazdDoPracy «Interfejs» StrategiaDojazdowa +dojedź() DojazdAutobusem +dojedź() DojazdRowerem +dojedź()

Strategia - przykład implementacji Różne metody keszowania danych z repozytorium

Strategia UsersCached +getone() «Interface» CacheInterface +get() +set() +delete() +clear() ArrayCache +get()... MemcachedCache +get()...

Strategia (interfejs strategii) <?php interface CacheInterface { public function set($key, $value, $ttl = null); public function get($key); public function delete($key); public function clear();

Strategia UsersCached +getone() «Interface» CacheInterface +get() +set() +delete() +clear() ArrayCache +get()... MemcachedCache +get()...

Strategia (implementacja strategii) <?php class ArrayCache implements CacheInterface { protected $data = array(); public function set($key, $value, $ttl = null) { // TODO: handle $ttl $this->data[$key] = $value; return true; public function delete($key) { /*... */ public function clear() { /*... */ public function get($key) { /*... */

Strategia UsersCached +getone() «Interface» CacheInterface +get() +set() +delete() +clear() ArrayCache +get()... MemcachedCache +get()...

Strategia (implementacja strategii 2) <?php class MemcachedCache implements CacheInterface { protected $memcached ; public function construct (Memcached $memcached ) { $this->memcahced = $memcached ; public function set($key, $value, $ttl = null) { $expires = $ttl === null? 0 : time() + $ttl; return $this->memcached->set($key, $value, $expires); public function get($key) { /*... */ public function delete($key) { /*... */ public function clear() { /*... */

Strategia UsersCached +getone() «Interface» CacheInterface +get() +set() +delete() +clear() ArrayCache +get()... MemcachedCache +get()...

Strategia (kontekst) <?php class UsersCached implements UsersRepositoryInterface { protected $usersrepo; protected $cache; public function construct( CacheInterface $cache, UsersRepositoryInterface $usersrepo ) { $this->cache = $cache; $this->usersrepo = $usersrepo; /*... */

Strategia (kontekst cd.) <?php class UsersCached implements UsersRepositoryInterface { /*... */ public function getone($id) { $cachekey = "users-repo-{$id"; $cacheduserdata = $this->cache->get($cachekey); if ($cacheduserdata) { return UserEntity::create($cachedUserData); $user = $this->usersrepo->getone($id); if ($user) { $this->cache->set($cachekey, $user->toarray(), 3600); return $user;

Strategia <?php $memcached = new Memcached(); $memcached->addserver('192.168.1.132', 11211); $memcachedcache = new MemcachedCache($memcached); $arraycache = new ArrayCache(); $usersrepo $memcachedrepo = new Users(); = new UsersCached($memcachedCache, $usersrepo); /* albo */ $arraycachedrepo = new UsersCached($arrayCache, $usersrepo);

Inne wzorce wzorce kreacyjne: Budowniczy Fabryka abstrakcyjna Metoda wytwórcza Prototyp Singleton wzorce strukturalne: Adapter Dekorator Fasada Kompozyt Most Pełnomocnik Pyłek wzorce czynnościowe (behawioralne): Interpreter Iterator Łańcuch zobowiązań Mediator Metoda szablonowa Obserwator Odwiedzający Pamiątka Polecenie Stan Strategia

SOLID

SOLID Single responsibility Zasada jednej odpowiedzialności Open-close Zasada otwarte-zamknięte Liskov substitution principle Zasada podstawienia Liskov Interface segregation principle Zasada separacji interfejsów Dependency inversion principle Zasada odwrócenia zależności