große systeme, lose kopplung, spaß bei der arbeit! - wdc12

80
Große Systeme, loose Kopplung... Stephan Hochdörfer, bitExpert AG

Upload: stephan-hochdoerfer

Post on 13-Jan-2015

506 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

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

Große Systeme, loose Kopplung...

Stephan Hochdörfer, bitExpert AG

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

Große Systeme, loose Kopplung...

Über mich

Stephan Hochdörfer, bitExpert AG

Department Manager Research Labs

PHP Entwickler seit 1999

[email protected]

@shochdoerfer

Page 3: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 4: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 5: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 6: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 7: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 8: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 9: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 10: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 11: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 12: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 13: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 14: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 15: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 16: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

"High-level modules should not depend on low-level modules.

Both should depend on abstractions."Robert C. Martin

Große Systeme, loose Kopplung...

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

Große Systeme, loose Kopplung...

High Level, Low Level...

User Controller

Datenbankverbindung (User DB)

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

Große Systeme, loose Kopplung...

High Level, Low Level...

User Controller

User Service

User Repository

Page 19: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 20: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Große Systeme, loose Kopplung...

Wie separieren? Horizontales Zerschneiden

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

Große Systeme, loose Kopplung...

Wie separieren? Horizontales Zerschneiden

Presentation Layer

Business Layer

Resource Access Layer

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

Große Systeme, loose Kopplung...

Wie separieren? Zerschneiden nach Services

Service Interface Layer

Business Layer

Resource Access Layer

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

Große Systeme, loose Kopplung...

Wie separieren? Zerschneiden in Services

Frontend

REST API

Datastore

Solr Search Service

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

Große Systeme, loose Kopplung...

Wie separieren? Vertikales Zerschneiden

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

Große Systeme, loose Kopplung...

Wie separieren? Vertikales Zerschneiden

ModulA ModulB ModulC

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

Große Systeme, loose Kopplung...

Wie separieren? Vertikal + Horizontal

PresentationLayer

BusinessLayer

ResourceAccess Layer

PresentationLayer

BusinessLayer

ResourceAccess Layer

PresentationLayer

BusinessLayer

ResourceAccess Layer

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

Große Systeme, loose Kopplung...

Wie separieren? Auf Aspekte achten

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

Große Systeme, loose Kopplung...

Wie separieren? Auf Aspekte achten

Presentation Layer

Business Layer

Resource Access Layer

Aspekte

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

Große Systeme, loose Kopplung...

Wie separieren? Auf Aspekte achten<?phpnamespace Acme\Products\Aspects;

/** * @FLOW3\Aspect */class LoggingAspect { /** * @FLOW3\Inject * @var \Acme\Logger\LoggerInterface */ protected $logger;

/** * @param \TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint * @FLOW3\Before("method(Acme\Products\Model\Product->delete())") */ public function log(\TYPO3\FLOW3\AOP\JoinPointInterface $jp) { $product = $jp->getMethodArgument('product'); $this->logger->info('Removing ' . $product->getName()); }}

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

Große Systeme, loose Kopplung...

Wie erreicht man eine loose Kopplung?

Page 31: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 32: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Große Systeme, loose Kopplung...

Registry Pattern<?php

Registry::set('platzhalter', 'Lorem ipsum...');

echo Registry::get('platzhalter');

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

Große Systeme, loose Kopplung...

<?php

Registry::set('platzhalter', 'Lorem ipsum...');

Registry::set('platzhalter', new RandomObject());

Registry::set('platzhalter', array());

echo Registry::get('platzhalter');

Registry Pattern – nicht typsicher!

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

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();

    }}

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

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

Page 36: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 37: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

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();

    }}

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

Große Systeme, loose Kopplung...

Wie richtig entkoppeln?

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

Dependencies explizit machen!

Große Systeme, loose Kopplung...

Wie richtig entkoppeln?

Page 40: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 41: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Große Systeme, loose Kopplung...

„Dependency Injection is akey element of agile architecture“

Ward Cunningham

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

Dependency Injection in 5 Slides

Große Systeme, loose Kopplung...

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

Dependency Injection in 5 Slides

Große Systeme, loose Kopplung...

new MyController(new MyService());

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

Dependency Injection in 5 Slides

Consumer

Große Systeme, loose Kopplung...

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

Dependency Injection in 5 Slides

Consumer Dependencies

Große Systeme, loose Kopplung...

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

Dependency Injection in 5 Slides

Consumer Dependencies Container

Große Systeme, loose Kopplung...

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

Dependency Injection in 5 Slides

Consumer Dependencies Container

Große Systeme, loose Kopplung...

Page 48: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 49: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Dependency Injection – Konfiguration (ein Weg)

Große Systeme, loose Kopplung...

<?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="Acme\TalkBundle\Service\TalkRepository" />

<service id="acme.talk.service" class="Acme\TalkBundle\Service\TalkService">

<argument type="service" id="acme.talk.repo" /></service>

</services></container>

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

Große Systeme, loose Kopplung...

Dependency Injection

„Dependency Injection“ basiert auf „Separation of concerns“.

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

Große Systeme, loose Kopplung...

Dependency Injection

Und wie hilft mir das nun beim Skalieren?

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

Große Systeme, loose Kopplung...

Dependency Injection

Loose Kopplung für loose Services

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

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);    }}

Page 54: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 55: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

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);

}

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

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);

}

Page 57: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 58: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 59: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 60: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Große Systeme, loose Kopplung...

Merke

Je verteilter, desto skalierbarer!

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

Große Systeme, loose Kopplung...

Merke

Je verteilter, desto schwerer zu debuggen!

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

Große Systeme, loose Kopplung...

Merke

Daraus folgt:Je verteilter, desto mehr Log!

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

Große Systeme, loose Kopplung...

Merke

Performance im Auge behalten!

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

Große Systeme, loose Kopplung...

Hilfe meine Applikation ist zu groß

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

Große Systeme, loose Kopplung...

Hilfe meine Applikation ist zu groß

Aufteilung in Module oder (Hilfs-)Bibliotheken

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

Große Systeme, loose Kopplung...

Hilfe meine Applikation ist zu groß

Bibliothek als Blackbox: Nur Verwenden, Implementierung egal

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

Dependency Management

Große Systeme, loose Kopplung...

Page 68: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 69: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Composer in drei Schritten: 1. Einbinden

Große Systeme, loose Kopplung...

curl -s https://getcomposer.org/installer | php

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

Composer in drei Schritten: 2. Konfigurieren

Große Systeme, loose Kopplung...

{"require": {

"symfony/translation": "2.1.*","symfony/config": "2.1.*","symfony/yaml": "2.1.*","twig/twig": "1.6.0"

}}

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

Composer in drei Schritten: 3. Installieren

Große Systeme, loose Kopplung...

php composer.phar install

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

Composer – Dependencies aktualisieren

Große Systeme, loose Kopplung...

php composer.phar update

Page 73: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 74: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Dependency Management

Große Systeme, loose Kopplung...

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

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.0http://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>

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

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>

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

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>

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

Große Systeme, loose Kopplung...

Maven(3) für PHP?

https://github.com/php-maven

Page 79: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12
Page 80: Große Systeme, lose Kopplung, Spaß bei der Arbeit! - WDC12

Vielen Dank!