Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
Frank KleineGo OO#IPC135 DESIGN PATTERNSvöllig subjektivausgewählteDienstag, 4. Juni 13
DesignPatterns1 2HilfreicheTippsDienstag, 4. Juni 13
5 Design Patterns1Dienstag, 4. Juni 13
Design Patterns?Dienstag, 4. Juni 13
Definition: WikipediaEntwurfsmuster (englisch design patterns)sind bewährte Lösungsschablonen fürwiederkehrende Entwurfspr...
Definition: IKEADienstag, 4. Juni 13
CompositeDienstag, 4. Juni 13
Zweck• Beliebige Zahl von Klassen gleicher Art soll für den Client wie eineeinzige Klasse erscheinen• Verstecken von Hiera...
TheorieDienstag, 4. Juni 13
Beispiel: Conditions$condition = new AndCondition();$condition->addCondition(new FooCondition())$or = new OrCondition();$o...
Beispiel: Doctrine$logger = new LoggerChain();$logger->addLogger(new EchoSQLLogger());$logger->addLogger(new DebugStack())...
DecoratorDienstag, 4. Juni 13
Zweck• Hinzufügen neuer Funktionalität zur Laufzeit• Vorhandene Funktionalität ändern• Verschiedene Funktionalitäten kombi...
TheorieDienstag, 4. Juni 13
Beispiel: Symfony2$kernel = new HttpKernel($dispatcher, $resolver);$kernel = new HttpCache($kernel,new Store(__DIR__./cach...
Beispiel: Symfony2$kernel = new HttpKernel($dispatcher, $resolver);$kernel = new HttpCache($kernel,new Store(__DIR__./cach...
Beispiel: stackphpuse SymfonyComponentHttpFoundationRequest;use SymfonyComponentHttpKernelHttpCacheStore;$app = new SilexA...
Template MethodDienstag, 4. Juni 13
Zweck• Sicherstellen der Reihenfolge von Schritten, mit der Möglichkeit einzelneSchritte unterschiedlich zu implementieren...
TheorieDienstag, 4. Juni 13
Beispielabstract class Recipe {public function prepare() {$this->collectIngredients();$this->prepareIngredients();return $...
CommandDienstag, 4. Juni 13
Zweck• Ausführen von Aktionen ohne dass Client konkrete Aktion kennt• Beliebige Kombinationen verschiedener Aktionen• Opti...
TheorieDienstag, 4. Juni 13
Beispiel: Cart Mappinginterface MappingCommand {function execute(Context $context, Cart $cart);function undo(Context $cont...
Moment...• Command dient zum Herumreichen von Code.• Das geht doch auch mit Closures...Dienstag, 4. Juni 13
Beispiel: callableclass Batch {private $commands = array();public function addCommand(callable $command) {$this->commands ...
VisitorDienstag, 4. Juni 13
Zweck• Hinzufügen neuer Operationen zu einer Objektstruktur• Neue Operationen werden im Visitor gekapselt• Achtung: gegebe...
TheorieDienstag, 4. Juni 13
Beispiel: vfsStreamvfsStream::setup(‘root‘, null, $complexStructure);vfsStream::inspect(new vfsStreamPrintVisitor());inter...
Achtung• Visitor in vfsStream kennt Datenstruktur - leichte Abwandlung desOriginalpatterns• Original: Visitor kennt Dateno...
Beispiel: Originalclass RentalAction {...public function accept(Visitor $visitor) {$visitor->visitRentalAction($this);$thi...
5 Hilfreiche Tipps2Dienstag, 4. Juni 13
Klasse statt MasseDienstag, 4. Juni 13
OO in der Königsklasse• Viele kleine Klassen, die sich miteinander kombinieren lassen• Große, umfangreiche Klassen führen ...
Design Patterns sind ein GewürzDienstag, 4. Juni 13
Hinweise zum Einsatz• Design Patterns sollen den Code besser strukturieren und verständlichermachen• Zu viel davon und der...
Manchmal reicht eine FunktionDienstag, 4. Juni 13
Funktionen• Es muss nicht immer eine Methode in einer Klasse sein• Vorsicht vor Klassen wie Utility, Helper o.ä.• Autoload...
Composer hilft weiter"autoload": {"psr-0": {"examplefoo": "src"},"files": ["src/functions.php","src/other/functions.php"]}D...
Namen sind nicht Schall und RauchDienstag, 4. Juni 13
Namen• Code kommuniziert.• Der erste Name ist immer falsch.• Wenn sich kein passender Name findet: Fachliches Verständnis ...
Die erste Lösung ist falsch.Dienstag, 4. Juni 13
Mindestens nicht richtig.• Nie bei der ersten Lösung bleiben - sie mag zwar nicht falsch sein, istaber wahrscheinlich auch...
www. phpdesignpatterns .deDienstag, 4. Juni 13
@BOVIGOHTTPS://JOIND.IN/8776VIELEN DANKDienstag, 4. Juni 13
Upcoming SlideShare
Loading in...5
×

Go OO! 5 wichtige Design Patterns

1,140

Published on

Dependency Injection, Service Locator, Client Session State, Class Table Inheritance - klingt alles wie der neue heiße Scheiß. Aber es gab Entwurfsmuster schon bevor jeder von Enterprise gesprochen hat. Lernen Sie die fünf wichtigsten Patterns kennen und wie Sie sie für schönere PHP-Architekturen einsetzen können.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,140
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Go OO! 5 wichtige Design Patterns

  1. 1. Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
  2. 2. Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
  3. 3. Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
  4. 4. Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
  5. 5. Frank KleineGo OO#IPC135 DESIGN PATTERNSvöllig subjektivausgewählteDienstag, 4. Juni 13
  6. 6. DesignPatterns1 2HilfreicheTippsDienstag, 4. Juni 13
  7. 7. 5 Design Patterns1Dienstag, 4. Juni 13
  8. 8. Design Patterns?Dienstag, 4. Juni 13
  9. 9. Definition: WikipediaEntwurfsmuster (englisch design patterns)sind bewährte Lösungsschablonen fürwiederkehrende Entwurfsprobleme sowohl inder Architektur als auch in derSoftwarearchitektur und -entwicklung. Siestellen damit eine wiederverwendbare Vorlagezur Problemlösung dar, die in einem bestimmtenZusammenhang einsetzbar ist.Dienstag, 4. Juni 13
  10. 10. Definition: IKEADienstag, 4. Juni 13
  11. 11. CompositeDienstag, 4. Juni 13
  12. 12. Zweck• Beliebige Zahl von Klassen gleicher Art soll für den Client wie eineeinzige Klasse erscheinen• Verstecken von Hierarchien vor dem Client• Logik des Zusammenschlusses soll für Client transparent bleibenDienstag, 4. Juni 13
  13. 13. TheorieDienstag, 4. Juni 13
  14. 14. Beispiel: Conditions$condition = new AndCondition();$condition->addCondition(new FooCondition())$or = new OrCondition();$or->addCondition(new BarCondition());$or->addCondition(new BazCondition());$condition->addCondition($or);if ($condition->isValid(‘foo.txt‘)) {echo ‘Is valid!‘;}Dienstag, 4. Juni 13
  15. 15. Beispiel: Doctrine$logger = new LoggerChain();$logger->addLogger(new EchoSQLLogger());$logger->addLogger(new DebugStack());$conn->getConfiguration()->setSQLLogger($logger):Dienstag, 4. Juni 13
  16. 16. DecoratorDienstag, 4. Juni 13
  17. 17. Zweck• Hinzufügen neuer Funktionalität zur Laufzeit• Vorhandene Funktionalität ändern• Verschiedene Funktionalitäten kombinieren• Nutzung von Komposition statt VererbungDienstag, 4. Juni 13
  18. 18. TheorieDienstag, 4. Juni 13
  19. 19. Beispiel: Symfony2$kernel = new HttpKernel($dispatcher, $resolver);$kernel = new HttpCache($kernel,new Store(__DIR__./cache));$kernel->handle($request)->send();Dienstag, 4. Juni 13
  20. 20. Beispiel: Symfony2$kernel = new HttpKernel($dispatcher, $resolver);$kernel = new HttpCache($kernel,new Store(__DIR__./cache));$kernel->handle($request)->send();public function handle($request) {if ($this->hasCachedResponse($request) {return $this->getCachedResponse($request);}$response = $this->originalKernel->handle($request);$this->store($response);return $response;}Dienstag, 4. Juni 13
  21. 21. Beispiel: stackphpuse SymfonyComponentHttpFoundationRequest;use SymfonyComponentHttpKernelHttpCacheStore;$app = new SilexApplication();$app->get(/, function () {return Hello World!;});$stack = (new StackBuilder())->push(StackSession)->push(SymfonyComponentHttpKernelHttpCacheHttpCache, new Store(__DIR__./cache));$app = $stack->resolve($app);$request = Request::createFromGlobals();$response = $app->handle($request)->send();Dienstag, 4. Juni 13
  22. 22. Template MethodDienstag, 4. Juni 13
  23. 23. Zweck• Sicherstellen der Reihenfolge von Schritten, mit der Möglichkeit einzelneSchritte unterschiedlich zu implementieren• Einzelschritte können mit Standardmethode bereit gestellt und damitoptional überschrieben werdenDienstag, 4. Juni 13
  24. 24. TheorieDienstag, 4. Juni 13
  25. 25. Beispielabstract class Recipe {public function prepare() {$this->collectIngredients();$this->prepareIngredients();return $this->cook();}protected abstract function collectIngredients();protected abstract function prepareIngredients();protected abstract function cook();}class CheeseburgerRecipe extends Recipe {protected function collectIngredients() { ... }protected function prepareIngredients() { ... }protected function cook() { ... }}Dienstag, 4. Juni 13
  26. 26. CommandDienstag, 4. Juni 13
  27. 27. Zweck• Ausführen von Aktionen ohne dass Client konkrete Aktion kennt• Beliebige Kombinationen verschiedener Aktionen• Optional: Bereitstellung von Undo-Funktionalität (jedoch kein Bestandteildes Patterns selbst)Dienstag, 4. Juni 13
  28. 28. TheorieDienstag, 4. Juni 13
  29. 29. Beispiel: Cart Mappinginterface MappingCommand {function execute(Context $context, Cart $cart);function undo(Context $context, Cart $cart);}class Mapping {...function applyMapping(Context $context , Cart $cart) {foreach ($this->mapCommands as $mapCommand) {$mapCommand->execute($context, $cart);}}}Dienstag, 4. Juni 13
  30. 30. Moment...• Command dient zum Herumreichen von Code.• Das geht doch auch mit Closures...Dienstag, 4. Juni 13
  31. 31. Beispiel: callableclass Batch {private $commands = array();public function addCommand(callable $command) {$this->commands = $command;}public function execute(Directory $dir) {foreach ($this->commands as $command) {$command($dir);}}}$batch = new Batch();$batch->addCommand(function (Directory $dir) { ... });$batch->addCommand([‘Example‘, ‘clear‘]);$batch->execute();Dienstag, 4. Juni 13
  32. 32. VisitorDienstag, 4. Juni 13
  33. 33. Zweck• Hinzufügen neuer Operationen zu einer Objektstruktur• Neue Operationen werden im Visitor gekapselt• Achtung: gegebenenfalls Aufbruch der Kapselung in ObjektstrukturerforderlichDienstag, 4. Juni 13
  34. 34. TheorieDienstag, 4. Juni 13
  35. 35. Beispiel: vfsStreamvfsStream::setup(‘root‘, null, $complexStructure);vfsStream::inspect(new vfsStreamPrintVisitor());interface vfsStreamVisitor {function visit(vfsStreamContent $content);function visitFile(vfsStreamFile $file);function visitDirectory(vfsStreamDirectory $dir);}Dienstag, 4. Juni 13
  36. 36. Achtung• Visitor in vfsStream kennt Datenstruktur - leichte Abwandlung desOriginalpatterns• Original: Visitor kennt Datenobjekte, aber nicht Datenstruktur• Datenstruktur reicht Visitor intern durchDienstag, 4. Juni 13
  37. 37. Beispiel: Originalclass RentalAction {...public function accept(Visitor $visitor) {$visitor->visitRentalAction($this);$this->vehicle->accept($visitor);$this->customer->accept($visitor);}}interface Visitor {function visitRentalAction(RentalAction $rent);function visitVehicle(Vehicle $vehicle);function visitCustomer(Customer $customer);}$visitor = new DebugVisitor();$rentalAction->accept($visitor);Dienstag, 4. Juni 13
  38. 38. 5 Hilfreiche Tipps2Dienstag, 4. Juni 13
  39. 39. Klasse statt MasseDienstag, 4. Juni 13
  40. 40. OO in der Königsklasse• Viele kleine Klassen, die sich miteinander kombinieren lassen• Große, umfangreiche Klassen führen zu geringer Flexibilität und sind eineGarantie für die Wartungshölle• Lieber Massen von Klassen statt viel Masse in einer KlasseDienstag, 4. Juni 13
  41. 41. Design Patterns sind ein GewürzDienstag, 4. Juni 13
  42. 42. Hinweise zum Einsatz• Design Patterns sollen den Code besser strukturieren und verständlichermachen• Zu viel davon und der Code wird ungenießbar• Das Pattern von heute ist das Anti-Pattern von morgenDienstag, 4. Juni 13
  43. 43. Manchmal reicht eine FunktionDienstag, 4. Juni 13
  44. 44. Funktionen• Es muss nicht immer eine Methode in einer Klasse sein• Vorsicht vor Klassen wie Utility, Helper o.ä.• Autoload?Dienstag, 4. Juni 13
  45. 45. Composer hilft weiter"autoload": {"psr-0": {"examplefoo": "src"},"files": ["src/functions.php","src/other/functions.php"]}Dienstag, 4. Juni 13
  46. 46. Namen sind nicht Schall und RauchDienstag, 4. Juni 13
  47. 47. Namen• Code kommuniziert.• Der erste Name ist immer falsch.• Wenn sich kein passender Name findet: Fachliches Verständnis falsch?Code überdenken und umbauen.Dienstag, 4. Juni 13
  48. 48. Die erste Lösung ist falsch.Dienstag, 4. Juni 13
  49. 49. Mindestens nicht richtig.• Nie bei der ersten Lösung bleiben - sie mag zwar nicht falsch sein, istaber wahrscheinlich auch nicht korrekt.• Selbst wenn sie richtig ist: es geht immer noch einfacher.• Mit anderen darüber reden hilft.Dienstag, 4. Juni 13
  50. 50. www. phpdesignpatterns .deDienstag, 4. Juni 13
  51. 51. @BOVIGOHTTPS://JOIND.IN/8776VIELEN DANKDienstag, 4. Juni 13

×