• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
 

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

on

  • 744 views

 

Statistics

Views

Total Views
744
Views on SlideShare
737
Embed Views
7

Actions

Likes
0
Downloads
2
Comments
0

1 Embed 7

http://lanyrd.com 7

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

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

    • 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 Entwickler seit 1999  S.Hochdoerfer@bitExpert.de  @shochdoerfer
    • Große Systeme, loose Kopplung... "High-level modules should not depend on low-level modules. Both should depend on abstractions." Robert C. Martin
    • Große Systeme, loose Kopplung... High Level, Low Level... User Controller Datenbankverbindung (User DB)
    • Große Systeme, loose Kopplung... High Level, Low Level... User Controller User Service User Repository
    • Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden
    • Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden Presentation Layer Business Layer Resource Access Layer
    • Große Systeme, loose Kopplung... Wie separieren? Zerschneiden nach Services Service Interface Layer Business Layer Resource Access Layer
    • Große Systeme, loose Kopplung... Wie separieren? Zerschneiden in Services Frontend REST API Solr Search Service Datastore
    • 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 Layer Layer Layer Business Business Business Layer Layer Layer Resource Resource Resource Access Layer Access Layer Access Layer
    • Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten
    • Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten Aspekte Presentation Layer Business Layer Resource Access Layer
    • 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()); } }
    • 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(platzhalter);
    • 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);
    • 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();     } }
    • 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
    • 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();     } }
    • 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“ Ward Cunningham
    • 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="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>
    • Große Systeme, loose Kopplung... Dependency Injection „Dependency Injection“ basiert auf „Separation of concerns“.
    • 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 IMyUserRepo      */     protected $myUserRepo;               public function __construct(     IMyUserRepo $myUserRepo) {         $this­>myUserRepo = $myUserRepo;     }               public function readUsers(Filter $filter) {    return $this­>myUserRepo­>read($filter);     } }
    • 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); }
    • 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); }
    • 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-)Bibliotheken
    • Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Bibliothek als Blackbox: Nur Verwenden, Implementierung egal
    • Große Systeme, loose Kopplung... Dependency Management
    • Große Systeme, loose Kopplung... Composer in drei Schritten: 1. Einbinden curl -s https://getcomposer.org/installer | php
    • 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" } }
    • 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="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>
    • 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>
    • 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>
    • Große Systeme, loose Kopplung... Maven(3) für PHP? https://github.com/php-maven
    • Vielen Dank!