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