SlideShare una empresa de Scribd logo
1 de 80
Descargar para leer sin conexión
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 ain't decoupling anything. You're
       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!

Más contenido relacionado

Destacado

Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Stephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaStephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Stephan Hochdörfer
 
Fließbandfertigung für Software-Applikationen
Fließbandfertigung für Software-ApplikationenFließbandfertigung für Software-Applikationen
Fließbandfertigung für Software-ApplikationenStephan Hochdörfer
 

Destacado (6)

Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12Offline strategies for HTML5 web applications - IPC12
Offline strategies for HTML5 web applications - IPC12
 
A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13A Phing fairy tale - ConFoo13
A Phing fairy tale - ConFoo13
 
Offline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmkaOffline-Strategien für HTML5 Web Applikationen - wmka
Offline-Strategien für HTML5 Web Applikationen - wmka
 
Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13Offline Strategies for HTML5 Web Applications - ipc13
Offline Strategies for HTML5 Web Applications - ipc13
 
Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13Offline strategies for HTML5 web applications - ConFoo13
Offline strategies for HTML5 web applications - ConFoo13
 
Fließbandfertigung für Software-Applikationen
Fließbandfertigung für Software-ApplikationenFließbandfertigung für Software-Applikationen
Fließbandfertigung für Software-Applikationen
 

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

Lose gekoppelt wie nie: DI vs. IoC
Lose gekoppelt wie nie: DI vs. IoCLose gekoppelt wie nie: DI vs. IoC
Lose gekoppelt wie nie: DI vs. IoCHendrik Lösch
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performanceglembotzky
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaGeorg Knon
 
SplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use CaseSplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use CaseSplunk
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunk
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und ReflectionStefan Marr
 
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay Dresden
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009Andreas Schulte
 
Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013NETWAYS
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisierenHendrik Lösch
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederChristoph Pickl
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumTorsten Fink
 
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)Novakenstein
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkdie.agilen GmbH
 
Let's talk about Java EE
Let's talk about Java EELet's talk about Java EE
Let's talk about Java EEAndreas König
 

Similar a Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12 (20)

Lose gekoppelt wie nie: DI vs. IoC
Lose gekoppelt wie nie: DI vs. IoCLose gekoppelt wie nie: DI vs. IoC
Lose gekoppelt wie nie: DI vs. IoC
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performance
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case Helvetia
 
SplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use CaseSplunkLive! Frankfurt 2016 - Helvetia Use Case
SplunkLive! Frankfurt 2016 - Helvetia Use Case
 
SplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case HelvetiaSplunkLive! Zürich 2016 - Use Case Helvetia
SplunkLive! Zürich 2016 - Use Case Helvetia
 
Metaprogrammierung und Reflection
Metaprogrammierung und ReflectionMetaprogrammierung und Reflection
Metaprogrammierung und Reflection
 
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
 
Web Applikations Security
Web Applikations SecurityWeb Applikations Security
Web Applikations Security
 
Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013Monitoring Openstack - LinuxTag 2013
Monitoring Openstack - LinuxTag 2013
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
Ajax, Comet & Co.
Ajax, Comet & Co.Ajax, Comet & Co.
Ajax, Comet & Co.
 
JSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael GreifenederJSUG - OSGi by Michael Greifeneder
JSUG - OSGi by Michael Greifeneder
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)
Migrate your Sametime Server to LDAP Authentication (Admincamp 2013)
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Let's talk about Java EE
Let's talk about Java EELet's talk about Java EE
Let's talk about Java EE
 

Más de Stephan Hochdörfer

Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Stephan Hochdörfer
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Stephan Hochdörfer
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Stephan Hochdörfer
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Stephan Hochdörfer
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Stephan Hochdörfer
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Stephan Hochdörfer
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Stephan Hochdörfer
 
Offline strategies for HTML5 web applications - pfCongres2012
Offline strategies for HTML5 web applications - pfCongres2012Offline strategies for HTML5 web applications - pfCongres2012
Offline strategies for HTML5 web applications - pfCongres2012Stephan Hochdörfer
 
Wie Software-Generatoren die Welt verändern können - Herbstcampus12
Wie Software-Generatoren die Welt verändern können - Herbstcampus12Wie Software-Generatoren die Welt verändern können - Herbstcampus12
Wie Software-Generatoren die Welt verändern können - Herbstcampus12Stephan Hochdörfer
 
Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Stephan Hochdörfer
 
Testing untestable code - oscon 2012
Testing untestable code - oscon 2012Testing untestable code - oscon 2012
Testing untestable code - oscon 2012Stephan Hochdörfer
 
Introducing a Software Generator Framework - JAZOON12
Introducing a Software Generator Framework - JAZOON12Introducing a Software Generator Framework - JAZOON12
Introducing a Software Generator Framework - JAZOON12Stephan Hochdörfer
 
Real World Dependency Injection SE - phpugrhh
Real World Dependency Injection SE - phpugrhhReal World Dependency Injection SE - phpugrhh
Real World Dependency Injection SE - phpugrhhStephan Hochdörfer
 
Managing variability in software applications - scandev12
Managing variability in software applications - scandev12Managing variability in software applications - scandev12
Managing variability in software applications - scandev12Stephan Hochdörfer
 
The state of DI in PHP - phpbnl12
The state of DI in PHP - phpbnl12The state of DI in PHP - phpbnl12
The state of DI in PHP - phpbnl12Stephan Hochdörfer
 
Facebook für PHP Entwickler - phpugffm
Facebook für PHP Entwickler - phpugffmFacebook für PHP Entwickler - phpugffm
Facebook für PHP Entwickler - phpugffmStephan Hochdörfer
 

Más de Stephan Hochdörfer (18)

Phing for power users - frOSCon8
Phing for power users - frOSCon8Phing for power users - frOSCon8
Phing for power users - frOSCon8
 
Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8Offline strategies for HTML5 web applications - frOSCon8
Offline strategies for HTML5 web applications - frOSCon8
 
Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13Offline Strategies for HTML5 Web Applications - oscon13
Offline Strategies for HTML5 Web Applications - oscon13
 
Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13 Offline Strategien für HTML5 Web Applikationen - dwx13
Offline Strategien für HTML5 Web Applikationen - dwx13
 
Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13Your Business. Your Language. Your Code - dpc13
Your Business. Your Language. Your Code - dpc13
 
Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13Phing for power users - dpc_uncon13
Phing for power users - dpc_uncon13
 
Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13Offline-Strategien für HTML5 Web Applikationen - bedcon13
Offline-Strategien für HTML5 Web Applikationen - bedcon13
 
Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12Offline-Strategien für HTML5Web Applikationen - WMMRN12
Offline-Strategien für HTML5Web Applikationen - WMMRN12
 
Offline strategies for HTML5 web applications - pfCongres2012
Offline strategies for HTML5 web applications - pfCongres2012Offline strategies for HTML5 web applications - pfCongres2012
Offline strategies for HTML5 web applications - pfCongres2012
 
Wie Software-Generatoren die Welt verändern können - Herbstcampus12
Wie Software-Generatoren die Welt verändern können - Herbstcampus12Wie Software-Generatoren die Welt verändern können - Herbstcampus12
Wie Software-Generatoren die Welt verändern können - Herbstcampus12
 
Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12
 
Testing untestable code - oscon 2012
Testing untestable code - oscon 2012Testing untestable code - oscon 2012
Testing untestable code - oscon 2012
 
Introducing a Software Generator Framework - JAZOON12
Introducing a Software Generator Framework - JAZOON12Introducing a Software Generator Framework - JAZOON12
Introducing a Software Generator Framework - JAZOON12
 
Separation of concerns - DPC12
Separation of concerns - DPC12Separation of concerns - DPC12
Separation of concerns - DPC12
 
Real World Dependency Injection SE - phpugrhh
Real World Dependency Injection SE - phpugrhhReal World Dependency Injection SE - phpugrhh
Real World Dependency Injection SE - phpugrhh
 
Managing variability in software applications - scandev12
Managing variability in software applications - scandev12Managing variability in software applications - scandev12
Managing variability in software applications - scandev12
 
The state of DI in PHP - phpbnl12
The state of DI in PHP - phpbnl12The state of DI in PHP - phpbnl12
The state of DI in PHP - phpbnl12
 
Facebook für PHP Entwickler - phpugffm
Facebook für PHP Entwickler - phpugffmFacebook für PHP Entwickler - phpugffm
Facebook für PHP Entwickler - phpugffm
 

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

  • 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.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16. Große Systeme, loose Kopplung... "High-level modules should not depend on low-level modules. Both should depend on abstractions." Robert C. Martin
  • 17. Große Systeme, loose Kopplung... High Level, Low Level... User Controller Datenbankverbindung (User DB)
  • 18. Große Systeme, loose Kopplung... High Level, Low Level... User Controller User Service User Repository
  • 19.
  • 20. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden
  • 21. Große Systeme, loose Kopplung... Wie separieren? Horizontales Zerschneiden Presentation Layer Business Layer Resource Access Layer
  • 22. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden nach Services Service Interface Layer Business Layer Resource Access Layer
  • 23. Große Systeme, loose Kopplung... Wie separieren? Zerschneiden in Services Frontend REST API Solr Search Service Datastore
  • 24. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden
  • 25. Große Systeme, loose Kopplung... Wie separieren? Vertikales Zerschneiden Modul A Modul B Modul C
  • 26. 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
  • 27. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten
  • 28. Große Systeme, loose Kopplung... Wie separieren? Auf Aspekte achten Aspekte Presentation Layer Business Layer Resource Access Layer
  • 29. 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()); } }
  • 30. Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung?
  • 31.
  • 32. Große Systeme, loose Kopplung... Registry Pattern <?php Registry::set('platzhalter', 'Lorem ipsum...'); echo Registry::get('platzhalter');
  • 33. 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');
  • 34. 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();     } }
  • 35. Große Systeme, loose Kopplung... Wie erreicht man eine loose Kopplung? „When you put a class name in a string you ain't decoupling anything. You're just hiding dependencies“ @jensschauder
  • 36.
  • 37. 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();     } }
  • 38. Große Systeme, loose Kopplung... Wie richtig entkoppeln?
  • 39. Große Systeme, loose Kopplung... Wie richtig entkoppeln? Dependencies explizit machen!
  • 40.
  • 41. Große Systeme, loose Kopplung... „Dependency Injection is a key element of agile architecture“ Ward Cunningham
  • 42. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides
  • 43. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides new MyController(new MyService());
  • 44. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer
  • 45. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies
  • 46. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  • 47. Große Systeme, loose Kopplung... Dependency Injection in 5 Slides Consumer Dependencies Container
  • 48.
  • 49. 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>
  • 50. Große Systeme, loose Kopplung... Dependency Injection „Dependency Injection“ basiert auf „Separation of concerns“.
  • 51. Große Systeme, loose Kopplung... Dependency Injection Und wie hilft mir das nun beim Skalieren?
  • 52. Große Systeme, loose Kopplung... Dependency Injection Loose Kopplung für loose Services
  • 53. 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);     } }
  • 54.
  • 55. 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); }
  • 56. 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); }
  • 57.
  • 58.
  • 59.
  • 60. Große Systeme, loose Kopplung... Merke Je verteilter, desto skalierbarer!
  • 61. Große Systeme, loose Kopplung... Merke Je verteilter, desto schwerer zu debuggen!
  • 62. Große Systeme, loose Kopplung... Merke Daraus folgt: Je verteilter, desto mehr Log!
  • 63. Große Systeme, loose Kopplung... Merke Performance im Auge behalten!
  • 64. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß
  • 65. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Aufteilung in Module oder (Hilfs-)Bibliotheken
  • 66. Große Systeme, loose Kopplung... Hilfe meine Applikation ist zu groß Bibliothek als Blackbox: Nur Verwenden, Implementierung egal
  • 67. Große Systeme, loose Kopplung... Dependency Management
  • 68.
  • 69. Große Systeme, loose Kopplung... Composer in drei Schritten: 1. Einbinden curl -s https://getcomposer.org/installer | php
  • 70. 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" } }
  • 71. Große Systeme, loose Kopplung... Composer in drei Schritten: 3. Installieren php composer.phar install
  • 72. Große Systeme, loose Kopplung... Composer – Dependencies aktualisieren php composer.phar update
  • 73.
  • 74. Große Systeme, loose Kopplung... Dependency Management
  • 75. 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>
  • 76. 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>
  • 77. 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>
  • 78. Große Systeme, loose Kopplung... Maven(3) für PHP? https://github.com/php-maven
  • 79.