@dbhurley OpenWest 2014
DI, SL, Testing, Life
A Pragmatic Approach
@dbhurley OpenWest 2014
WELCOME!
This session is not intimidating. This session is
not intimidating. This session is not intimidating.
This session is not intimidating. This session is
not intimidating. This session is not intimidating.
This session is not intimidating. This session is
not intimidating. This session is not intimidating.
This session is not intimidating. This session is
not intimidating. This session is not intimidating.
This session is not intimidating. This session is
not intimidating. This session is not intimidating.
This session is not intimidating. This session is
not inti
@dbhurley OpenWest 2014
WHO?
David Hurley
Open Source Evangelist
Entrepreneur / Co-Founder
Joomla! Community Manager
Production Leadership Team
@dbhurley OpenWest 2014
TERMS
Dependency Injection
An injection is the passing of a dependency (a service)
to a dependent object (a client).
Service Locator
A design pattern which uses a central registry and on
request returns the information necessary to a client.
Inversion of Control
A design in which portions of a computer program
receive flow of control from a generic, reusable library
@dbhurley OpenWest 2014
3 TYPES OF DEPENDENCY INJECTION
Constructor Setter Interface
class carPicker
{
function carPicker ( Finder $finder )
{
$this->finder = $finder;
@dbhurley OpenWest 2014
SERVICE LOCATORS
Most often seen used as a singleton registry*
class serviceLocator {
public static function carFinder ()
{
return static::finder;
}
class carPicker {
function carPicker() {
$finder = serviceLocator::carFinder();
@dbhurley OpenWest 2014
WHAT WE’RE NOT DISCUSSING
@dbhurley OpenWest 2014
WHAT WE ARE DISCUSSING
@dbhurley OpenWest 2014
THE LAW OF DEMETER
Each unit should have only limited knowledge about
other units: only units "closely" related to the current unit.
Each unit should only talk to its friends; don't talk to
strangers.
Only talk to your immediate friends.
@dbhurley OpenWest 2014
WHAT’S THAT MEAN?
Question
How do you pay your tab at a restaurant?
@dbhurley OpenWest 2014
APPLY SL
class Car {
protected $seats
protected $seatbelt
function buildCar (Locator $locator) {
$this->seats = $locator->getSeats();
$this->seatbelt = $locator->getSeatbelt();
...
}
}
@dbhurley OpenWest 2014
APPLY DI
class carFactory {
function buildCar() {
$seatbelt = new SeatBelt();
$seats = new Seats($seatbelt);
return new Car($seats);
}
}
@dbhurley OpenWest 2014
LOOKING DEEPER
class Car {
function _constructor(Seats $seats) {
...
}
}
class Seats {
function _constructor(Seatbelt $seatbelt, Fabric
$fabric) {
…
}
@dbhurley OpenWest 2014
RETURN TO FACTORY
class carFactory {
function buildCar() {
$seatbelt = new SeatBelt();
$fabric = new Fabric();
$seats = new Seats($seatbelt, $fabric);
return new Car($seats);
}
}
@dbhurley OpenWest 2014
KEY CONCEPT?
A Factory is used for all the objects of
the same lifetime.
Constructor Injection: Only inject items whose lifetime is
equal or greater than the injectee
(i.e. The seat is alive at least as long as the car)
Method Parameter: At execution for shorter lifetimes.
@dbhurley OpenWest 2014
TESTING
Service Locators are often difficult to test.
Mixed responsibilities / Law of Demeter partially broken
Dependency Injection allows for easy testing.
Clear to follow / Law of Demeter obeyed
Side note: Null checking
Pre-condition checking is hard to test. Rather check that
things work as expected rather than checking against
nulls.
@dbhurley OpenWest 2014
THE GOAL
The goal is to write clean, concise, easily-
testable code which accomplishes a
purpose and allows others to improve it.
@dbhurley OpenWest 2014
THE OUTCOME
A strong codebase which can be easily read
and understood by others.
“Always code as if the guy who ends
up maintaining your code will be a violent
psychopath who knows where you live.”
@dbhurley OpenWest 2014
QUESTIONS?
David Hurley
@dbhurley (twitter, facebook, linkedin)
me@dbhurley.com

Dependency Injection, Service Locators, Testing and Life

  • 1.
    @dbhurley OpenWest 2014 DI,SL, Testing, Life A Pragmatic Approach
  • 2.
    @dbhurley OpenWest 2014 WELCOME! Thissession is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not intimidating. This session is not inti
  • 3.
    @dbhurley OpenWest 2014 WHO? DavidHurley Open Source Evangelist Entrepreneur / Co-Founder Joomla! Community Manager Production Leadership Team
  • 4.
    @dbhurley OpenWest 2014 TERMS DependencyInjection An injection is the passing of a dependency (a service) to a dependent object (a client). Service Locator A design pattern which uses a central registry and on request returns the information necessary to a client. Inversion of Control A design in which portions of a computer program receive flow of control from a generic, reusable library
  • 5.
    @dbhurley OpenWest 2014 3TYPES OF DEPENDENCY INJECTION Constructor Setter Interface class carPicker { function carPicker ( Finder $finder ) { $this->finder = $finder;
  • 6.
    @dbhurley OpenWest 2014 SERVICELOCATORS Most often seen used as a singleton registry* class serviceLocator { public static function carFinder () { return static::finder; } class carPicker { function carPicker() { $finder = serviceLocator::carFinder();
  • 7.
    @dbhurley OpenWest 2014 WHATWE’RE NOT DISCUSSING
  • 8.
  • 9.
    @dbhurley OpenWest 2014 THELAW OF DEMETER Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. Each unit should only talk to its friends; don't talk to strangers. Only talk to your immediate friends.
  • 10.
    @dbhurley OpenWest 2014 WHAT’STHAT MEAN? Question How do you pay your tab at a restaurant?
  • 11.
    @dbhurley OpenWest 2014 APPLYSL class Car { protected $seats protected $seatbelt function buildCar (Locator $locator) { $this->seats = $locator->getSeats(); $this->seatbelt = $locator->getSeatbelt(); ... } }
  • 12.
    @dbhurley OpenWest 2014 APPLYDI class carFactory { function buildCar() { $seatbelt = new SeatBelt(); $seats = new Seats($seatbelt); return new Car($seats); } }
  • 13.
    @dbhurley OpenWest 2014 LOOKINGDEEPER class Car { function _constructor(Seats $seats) { ... } } class Seats { function _constructor(Seatbelt $seatbelt, Fabric $fabric) { … }
  • 14.
    @dbhurley OpenWest 2014 RETURNTO FACTORY class carFactory { function buildCar() { $seatbelt = new SeatBelt(); $fabric = new Fabric(); $seats = new Seats($seatbelt, $fabric); return new Car($seats); } }
  • 15.
    @dbhurley OpenWest 2014 KEYCONCEPT? A Factory is used for all the objects of the same lifetime. Constructor Injection: Only inject items whose lifetime is equal or greater than the injectee (i.e. The seat is alive at least as long as the car) Method Parameter: At execution for shorter lifetimes.
  • 16.
    @dbhurley OpenWest 2014 TESTING ServiceLocators are often difficult to test. Mixed responsibilities / Law of Demeter partially broken Dependency Injection allows for easy testing. Clear to follow / Law of Demeter obeyed Side note: Null checking Pre-condition checking is hard to test. Rather check that things work as expected rather than checking against nulls.
  • 17.
    @dbhurley OpenWest 2014 THEGOAL The goal is to write clean, concise, easily- testable code which accomplishes a purpose and allows others to improve it.
  • 18.
    @dbhurley OpenWest 2014 THEOUTCOME A strong codebase which can be easily read and understood by others. “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.”
  • 19.
    @dbhurley OpenWest 2014 QUESTIONS? DavidHurley @dbhurley (twitter, facebook, linkedin) me@dbhurley.com