Große Systeme,   loose Kopplung...Stephan Hochdörfer, bitExpert AG
Große Systeme, loose Kopplung... Über mich  Stephan Hochdörfer, bitExpert AG  Department Manager Research Labs  PHP Ent...
Große Systeme, loose Kopplung...      "High-level modules should not       depend on low-level modules.    Both should dep...
Große Systeme, loose Kopplung... High Level, Low Level...                     User Controller           Datenbankverbindun...
Große Systeme, loose Kopplung... High Level, Low Level...                     User Controller                       User S...
Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden
Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden                   Presentation Layer           ...
Große Systeme, loose Kopplung... Wie separieren? Zerschneiden nach Services                Service Interface Layer        ...
Große Systeme, loose Kopplung... Wie separieren? Zerschneiden in Services                         Frontend            REST...
Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden
Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden         Modul A         Modul B   Modul C
Große Systeme, loose Kopplung... Wie separieren? Vertikal + Horizontal       Presentation    Presentation   Presentation  ...
Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten
Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten Aspekte                     Presentation Layer        ...
Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten <?php namespace AcmeProductsAspects; /**  * @FLOW3Aspe...
Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung?
Große Systeme, loose Kopplung... Registry Pattern <?php Registry::set(platzhalter, Lorem ipsum...); echo Registry::get(pla...
Große Systeme, loose Kopplung... Registry Pattern – nicht typsicher! <?php Registry::set(platzhalter, Lorem ipsum...); Reg...
Große Systeme, loose Kopplung... Registry Pattern <?php class MyController {     protected $myService;               publi...
Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung? „When you put a class name in a string  you aint de...
Große Systeme, loose Kopplung... Service Locator <?php class MyController {     protected $myService;               public...
Große Systeme, loose Kopplung... Wie richtig entkoppeln?
Große Systeme, loose Kopplung... Wie richtig entkoppeln?        Dependencies explizit machen!
Große Systeme, loose Kopplung...        „Dependency Injection is a     key element of agile architecture“                 ...
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides new MyController(new MyService());
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides    Consumer
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides    Consumer            Dependencies
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides    Consumer            Dependencies   Container
Große Systeme, loose Kopplung... Dependency Injection in 5 Slides    Consumer            Dependencies   Container
Große Systeme, loose Kopplung... Dependency Injection – Konfiguration (ein Weg) <?xml version="1.0" ?> <container xmlns="h...
Große Systeme, loose Kopplung... Dependency Injection     „Dependency Injection“ basiert auf         „Separation of concer...
Große Systeme, loose Kopplung... Dependency Injection               Und wie hilft mir das               nun beim Skalieren?
Große Systeme, loose Kopplung... Dependency Injection     Loose Kopplung für loose Services
Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php class MyUserService {     /**      * @var IMy...
Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php interface IMyUserRepo {     /**      * Liest ...
Große Systeme, loose Kopplung... Dependency Injection – Loose Kooplung <?php class DBRepo implements IMyUserRepo {     /**...
Große Systeme, loose Kopplung... Merke       Je verteilter, desto skalierbarer!
Große Systeme, loose Kopplung... Merke      Je verteilter, desto schwerer zu                  debuggen!
Große Systeme, loose Kopplung... Merke                 Daraus folgt:        Je verteilter, desto mehr Log!
Große Systeme, loose Kopplung... Merke       Performance im Auge behalten!
Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß
Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß               Aufteilung in       Module oder (Hilfs-...
Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß       Bibliothek als Blackbox: Nur Verwenden, Impleme...
Große Systeme, loose Kopplung... Dependency Management
Große Systeme, loose Kopplung... Composer in drei Schritten: 1. Einbinden                 curl -s  https://getcomposer.org...
Große Systeme, loose Kopplung... Composer in drei Schritten: 2. Konfigurieren {     "require": {         "symfony/translat...
Große Systeme, loose Kopplung... Composer in drei Schritten: 3. Installieren            php composer.phar install
Große Systeme, loose Kopplung... Composer – Dependencies aktualisieren           php composer.phar update
Große Systeme, loose Kopplung... Dependency Management
Große Systeme, loose Kopplung... Maven - Project Object Model <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi...
Große Systeme, loose Kopplung... Maven - Dependencies <dependencies>    <dependency>       <groupId>com.zend</groupId>    ...
Große Systeme, loose Kopplung... Maven für PHP? <pluginRepository>    <id>release-repo1.php-maven.org</id>    <name>PHP-Ma...
Große Systeme, loose Kopplung... Maven(3) für PHP?        https://github.com/php-maven
Vielen Dank!
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Upcoming SlideShare
Loading in...5
×

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

585

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
585
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Große Systeme, loose Kopplung...Stephan Hochdörfer, bitExpert AG
  2. 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. 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. 4. Große Systeme, loose Kopplung... High Level, Low Level... User Controller Datenbankverbindung (User DB)
  5. 5. Große Systeme, loose Kopplung... High Level, Low Level... User Controller User Service User Repository
  6. 6. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden
  7. 7. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden Presentation Layer Business Layer Resource Access Layer
  8. 8. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden nach Services Service Interface Layer Business Layer Resource Access Layer
  9. 9. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden in Services Frontend REST API Solr Search Service Datastore
  10. 10. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden
  11. 11. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden Modul A Modul B Modul C
  12. 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. 13. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten
  14. 14. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten Aspekte Presentation Layer Business Layer Resource Access Layer
  15. 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. 16. Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung?
  17. 17. Große Systeme, loose Kopplung... Registry Pattern <?php Registry::set(platzhalter, Lorem ipsum...); echo Registry::get(platzhalter);
  18. 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. 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. 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. 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. 22. Große Systeme, loose Kopplung... Wie richtig entkoppeln?
  23. 23. Große Systeme, loose Kopplung... Wie richtig entkoppeln? Dependencies explizit machen!
  24. 24. Große Systeme, loose Kopplung... „Dependency Injection is a key element of agile architecture“ Ward Cunningham
  25. 25. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides
  26. 26. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides new MyController(new MyService());
  27. 27. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer
  28. 28. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies
  29. 29. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  30. 30. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  31. 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. 32. Große Systeme, loose Kopplung... Dependency Injection „Dependency Injection“ basiert auf „Separation of concerns“.
  33. 33. Große Systeme, loose Kopplung... Dependency Injection Und wie hilft mir das nun beim Skalieren?
  34. 34. Große Systeme, loose Kopplung... Dependency Injection Loose Kopplung für loose Services
  35. 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. 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. 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. 38. Große Systeme, loose Kopplung... Merke Je verteilter, desto skalierbarer!
  39. 39. Große Systeme, loose Kopplung... Merke Je verteilter, desto schwerer zu debuggen!
  40. 40. Große Systeme, loose Kopplung... Merke Daraus folgt: Je verteilter, desto mehr Log!
  41. 41. Große Systeme, loose Kopplung... Merke Performance im Auge behalten!
  42. 42. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß
  43. 43. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Aufteilung in Module oder (Hilfs-)Bibliotheken
  44. 44. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Bibliothek als Blackbox: Nur Verwenden, Implementierung egal
  45. 45. Große Systeme, loose Kopplung... Dependency Management
  46. 46. Große Systeme, loose Kopplung... Composer in drei Schritten: 1. Einbinden curl -s https://getcomposer.org/installer | php
  47. 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. 48. Große Systeme, loose Kopplung... Composer in drei Schritten: 3. Installieren php composer.phar install
  49. 49. Große Systeme, loose Kopplung... Composer – Dependencies aktualisieren php composer.phar update
  50. 50. Große Systeme, loose Kopplung... Dependency Management
  51. 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. 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. 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. 54. Große Systeme, loose Kopplung... Maven(3) für PHP? https://github.com/php-maven
  55. 55. Vielen Dank!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×