• Save
Go OO! 5 wichtige Design Patterns
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Go OO! 5 wichtige Design Patterns

on

  • 1,266 views

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

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.

Statistics

Views

Total Views
1,266
Views on SlideShare
1,025
Embed Views
241

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 241

http://eventifier.co 221
https://twitter.com 20

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Go OO! 5 wichtige Design Patterns Presentation Transcript

  • 1. Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
  • 2. Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
  • 3. Lebt inKarlsruheNicht StephanSchmidtFrank KleineSoftwareArchitectDienstag, 4. Juni 13
  • 4. Frank KleineGo OO#IPC135 WICHTIGE DESIGN PATTERNSDienstag, 4. Juni 13
  • 5. Frank KleineGo OO#IPC135 DESIGN PATTERNSvöllig subjektivausgewählteDienstag, 4. Juni 13
  • 6. DesignPatterns1 2HilfreicheTippsDienstag, 4. Juni 13
  • 7. 5 Design Patterns1Dienstag, 4. Juni 13
  • 8. Design Patterns?Dienstag, 4. Juni 13
  • 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. Definition: IKEADienstag, 4. Juni 13
  • 11. CompositeDienstag, 4. Juni 13
  • 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. TheorieDienstag, 4. Juni 13
  • 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. Beispiel: Doctrine$logger = new LoggerChain();$logger->addLogger(new EchoSQLLogger());$logger->addLogger(new DebugStack());$conn->getConfiguration()->setSQLLogger($logger):Dienstag, 4. Juni 13
  • 16. DecoratorDienstag, 4. Juni 13
  • 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. TheorieDienstag, 4. Juni 13
  • 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. 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. 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. Template MethodDienstag, 4. Juni 13
  • 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. TheorieDienstag, 4. Juni 13
  • 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. CommandDienstag, 4. Juni 13
  • 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. TheorieDienstag, 4. Juni 13
  • 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. Moment...• Command dient zum Herumreichen von Code.• Das geht doch auch mit Closures...Dienstag, 4. Juni 13
  • 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. VisitorDienstag, 4. Juni 13
  • 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. TheorieDienstag, 4. Juni 13
  • 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. 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. 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. 5 Hilfreiche Tipps2Dienstag, 4. Juni 13
  • 39. Klasse statt MasseDienstag, 4. Juni 13
  • 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. Design Patterns sind ein GewürzDienstag, 4. Juni 13
  • 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. Manchmal reicht eine FunktionDienstag, 4. Juni 13
  • 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. Composer hilft weiter"autoload": {"psr-0": {"examplefoo": "src"},"files": ["src/functions.php","src/other/functions.php"]}Dienstag, 4. Juni 13
  • 46. Namen sind nicht Schall und RauchDienstag, 4. Juni 13
  • 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. Die erste Lösung ist falsch.Dienstag, 4. Juni 13
  • 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. www. phpdesignpatterns .deDienstag, 4. Juni 13
  • 51. @BOVIGOHTTPS://JOIND.IN/8776VIELEN DANKDienstag, 4. Juni 13