Your SlideShare is downloading. ×
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

534
views

Published on

Published in: Technology, Business

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
534
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Große Systeme, loose Kopplung...Stephan Hochdörfer, bitExpert AG
  • 2. Große Systeme, loose Kopplung... Über mich  Stephan Hochdörfer, bitExpert AG  Department Manager Research Labs  PHP Entwickler seit 1999  S.Hochdoerfer@bitExpert.de  @shochdoerfer
  • 3. Große Systeme, loose Kopplung... "High-level modules should not depend on low-level modules. Both should depend on abstractions." Robert C. Martin
  • 4. Große Systeme, loose Kopplung... High Level, Low Level... User Controller Datenbankverbindung (User DB)
  • 5. Große Systeme, loose Kopplung... High Level, Low Level... User Controller User Service User Repository
  • 6. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden
  • 7. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden Presentation Layer Business Layer Resource Access Layer
  • 8. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden nach Services Service Interface Layer Business Layer Resource Access Layer
  • 9. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden in Services Frontend REST API Solr Search Service Datastore
  • 10. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden
  • 11. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden Modul A Modul B Modul C
  • 12. Große Systeme, loose Kopplung... Wie separieren? Vertikal + Horizontal Presentation Presentation Presentation Layer Layer Layer Business Business Business Layer Layer Layer Resource Resource Resource Access Layer Access Layer Access Layer
  • 13. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten
  • 14. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten Aspekte Presentation Layer Business Layer Resource Access Layer
  • 15. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten <?php namespace AcmeProductsAspects; /** * @FLOW3Aspect */ class LoggingAspect { /** * @FLOW3Inject * @var AcmeLoggerLoggerInterface */ protected $logger; /** * @param TYPO3FLOW3AOPJoinPointInterface $joinPoint * @FLOW3Before("method(AcmeProductsModelProduct->delete())") */ public function log(TYPO3FLOW3AOPJoinPointInterface $jp) { $product = $jp->getMethodArgument(product); $this->logger->info(Removing . $product->getName()); } }
  • 16. Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung?
  • 17. Große Systeme, loose Kopplung... Registry Pattern <?php Registry::set(platzhalter, Lorem ipsum...); echo Registry::get(platzhalter);
  • 18. Große Systeme, loose Kopplung... Registry Pattern – nicht typsicher! <?php Registry::set(platzhalter, Lorem ipsum...); Registry::set(platzhalter, new RandomObject()); Registry::set(platzhalter, array()); echo Registry::get(platzhalter);
  • 19. Große Systeme, loose Kopplung... Registry Pattern <?php class MyController {     protected $myService;               public function __construct() {        $this­>myService =             Registry::get(MyService);     }          public function execute() {    $this­>myService­>doStuff();     } }
  • 20. Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung? „When you put a class name in a string you aint decoupling anything. Youre just hiding dependencies“ @jensschauder
  • 21. Große Systeme, loose Kopplung... Service Locator <?php class MyController {     protected $myService;               public function __construct() {        $this­>myService =             ServiceLocator::getMyService();     }          public function execute() {    $this­>myService­>doStuff();     } }
  • 22. Große Systeme, loose Kopplung... Wie richtig entkoppeln?
  • 23. Große Systeme, loose Kopplung... Wie richtig entkoppeln? Dependencies explizit machen!
  • 24. Große Systeme, loose Kopplung... „Dependency Injection is a key element of agile architecture“ Ward Cunningham
  • 25. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides
  • 26. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides new MyController(new MyService());
  • 27. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer
  • 28. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies
  • 29. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  • 30. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  • 31. Große Systeme, loose Kopplung... Dependency Injection – Konfiguration (ein Weg) <?xml version="1.0" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="acme.talk.repo" class="AcmeTalkBundleServiceTalkRepository" /> <service id="acme.talk.service" class="AcmeTalkBundleServiceTalkService"> <argument type="service" id="acme.talk.repo" /> </service> </services> </container>
  • 32. Große Systeme, loose Kopplung... Dependency Injection „Dependency Injection“ basiert auf „Separation of concerns“.
  • 33. Große Systeme, loose Kopplung... Dependency Injection Und wie hilft mir das nun beim Skalieren?
  • 34. Große Systeme, loose Kopplung... Dependency Injection Loose Kopplung für loose Services
  • 35. Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php class MyUserService {     /**      * @var IMyUserRepo      */     protected $myUserRepo;               public function __construct(     IMyUserRepo $myUserRepo) {         $this­>myUserRepo = $myUserRepo;     }               public function readUsers(Filter $filter) {    return $this­>myUserRepo­>read($filter);     } }
  • 36. Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php interface IMyUserRepo { /**  * Liest User aus dem Repository und gibt   * diese zurück.  * @param Filter $filter  * @return array  */ public function read(Filter $filter); }
  • 37. Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php class DBRepo implements IMyUserRepo { /**  * @see IMyUserRepo.read()  */ public function read(Filter $filter); } class WebserviceRepo implements IMyUserRepo { /**  * @see IMyUserRepo.read()  */ public function read(Filter $filter); }
  • 38. Große Systeme, loose Kopplung... Merke Je verteilter, desto skalierbarer!
  • 39. Große Systeme, loose Kopplung... Merke Je verteilter, desto schwerer zu debuggen!
  • 40. Große Systeme, loose Kopplung... Merke Daraus folgt: Je verteilter, desto mehr Log!
  • 41. Große Systeme, loose Kopplung... Merke Performance im Auge behalten!
  • 42. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß
  • 43. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Aufteilung in Module oder (Hilfs-)Bibliotheken
  • 44. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Bibliothek als Blackbox: Nur Verwenden, Implementierung egal
  • 45. Große Systeme, loose Kopplung... Dependency Management
  • 46. Große Systeme, loose Kopplung... Composer in drei Schritten: 1. Einbinden curl -s https://getcomposer.org/installer | php
  • 47. Große Systeme, loose Kopplung... Composer in drei Schritten: 2. Konfigurieren { "require": { "symfony/translation": "2.1.*", "symfony/config": "2.1.*", "symfony/yaml": "2.1.*", "twig/twig": "1.6.0" } }
  • 48. Große Systeme, loose Kopplung... Composer in drei Schritten: 3. Installieren php composer.phar install
  • 49. Große Systeme, loose Kopplung... Composer – Dependencies aktualisieren php composer.phar update
  • 50. Große Systeme, loose Kopplung... Dependency Management
  • 51. Große Systeme, loose Kopplung... Maven - Project Object Model <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <groupId>com.acme</groupId> <artifactId>myproject</artifactId> <packaging>jar</packaging> <version>0.0.1-SNAPSHOT</version> <name>My project</name> </project>
  • 52. Große Systeme, loose Kopplung... Maven - Dependencies <dependencies> <dependency> <groupId>com.zend</groupId> <artifactId>framework</artifactId> <version>1.11.6-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies>
  • 53. Große Systeme, loose Kopplung... Maven für PHP? <pluginRepository> <id>release-repo1.php-maven.org</id> <name>PHP-Maven 2 Release Repository</name> <url>http://repo1.php-maven.org/release</url> <releases> <enabled>true</enabled> </releases> </pluginRepository>
  • 54. Große Systeme, loose Kopplung... Maven(3) für PHP? https://github.com/php-maven
  • 55. Vielen Dank!