Dependency Injection,
            WTF?
      Luís Otávio Cobucci Oblonczyk



27 de Outubro de 2012
Luís Otávio Cobucci Oblonczyk
●
    Evangelista (doido por) PHP
●
    Desenvolvedor na Softnex Tecnologia (SC)
●
    Membro do PHPSC
●
    ZCE PHP 5.3
●
    Perfeccionista ao extremo =P


    @lcobucci
    http://about.me/lcobucci
Mandamento principal da OOP



    “Alta coesão e baixo
       acoplamento”
Problemas do alto acoplamento
●
    Dificuldade de testabilidade
●
    Demora para entender o código
●
    Manutenção do código
●
    Baixa extensibilidade
●
    Impossibilidade de reutilização
Dependency Injection não é nada novo!
O que é DI?
“Dependency injection is a software design
pattern that allows a choice of component to be
made at run-time rather than compile time.”

http://en.wikipedia.org/wiki/Dependency_injection
Indo devagar...
<?php
namespace LcobucciSamples;
use PDO;
class UserManager
{
    private $conn;
    public function __construct()
    {
        $this->conn = new PDO(
            'mysql:dbname=test;host=localhost',
            'root',
            'root'
        );
    }
}
<?php
namespace LcobucciSamples;

use PDO;

class UserManager
{
    private $conn;

    public function __construct($dsn, $user, $pass)
    {
        $this->conn = new PDO(
            $dsn,
            $user,
            $pass
        );
    }
}
<?php
namespace LcobucciSamples;

use PDO;

class UserManager
{
    private $conn;

    public function __construct(PDO $conn)
    {
        $this->conn = $conn;
    }
}
Tá, e se não quiser persistir em banco de dados?
<?php
namespace LcobucciSamples;

interface DataStorage
{}

class DbStorage implements DataStorage
{}

class FileStorage implements DataStorage
{}

class FakeStorage implements DataStorage
{}

class UserManager
{
    private $storage;

    public function __construct(DataStorage $storage)
    {
        $this->storage = $storage;
    }
}
Formas de injeção de
Dependência
●
    Construtor
●
    Setter
●
    Atributo
<?php
namespace LcobucciSamples;

$storage = new DbStorage();

// Constutor
$manager = new UserManager($storage);

// Setter
$manager = new UserManager();
$manager->setStorage($storage);

// Atributo
$manager = new UserManager();
$manager->storage = $storage;
Containers!
Containers
●
    Criam e armazenam os objetos de acordo com
    as regras nele definidas
●
    Possibilitam a separação entre a configuração
    da criação dos objetos e o uso deles
●
    Os objetos são denominados “serviços” e cada
    um possui um identificador único.
●
    É possível armazenar parâmetros para serem
    utilizados na construção dos serviços
Frameworks
Devido facilitar a separação de responsabilidades
e manter o código mais limpo e organizado, os
frameworks modernos estão trazendo containers
de injeção de dependências através de seus
componentes.




    Pimple              RespectConfig
Lembrem-se
Conclusão...
●
    Dependency Injection facilita a separação das
    responsabilidades das suas classes, mantendo
    baixo o acoplamento entre os componentes
●
    Podemos utilizar Injeção    de dependência
    independentemente    de      frameworks  e
    containers
Obrigado!

Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci

Dependency injection WTF? - PHPSC Conference 2012

  • 1.
    Dependency Injection, WTF? Luís Otávio Cobucci Oblonczyk 27 de Outubro de 2012
  • 2.
    Luís Otávio CobucciOblonczyk ● Evangelista (doido por) PHP ● Desenvolvedor na Softnex Tecnologia (SC) ● Membro do PHPSC ● ZCE PHP 5.3 ● Perfeccionista ao extremo =P @lcobucci http://about.me/lcobucci
  • 3.
    Mandamento principal daOOP “Alta coesão e baixo acoplamento”
  • 4.
    Problemas do altoacoplamento ● Dificuldade de testabilidade ● Demora para entender o código ● Manutenção do código ● Baixa extensibilidade ● Impossibilidade de reutilização
  • 5.
  • 6.
    O que éDI? “Dependency injection is a software design pattern that allows a choice of component to be made at run-time rather than compile time.” http://en.wikipedia.org/wiki/Dependency_injection
  • 7.
  • 8.
    <?php namespace LcobucciSamples; use PDO; classUserManager { private $conn; public function __construct() { $this->conn = new PDO( 'mysql:dbname=test;host=localhost', 'root', 'root' ); } }
  • 9.
    <?php namespace LcobucciSamples; use PDO; classUserManager { private $conn; public function __construct($dsn, $user, $pass) { $this->conn = new PDO( $dsn, $user, $pass ); } }
  • 10.
    <?php namespace LcobucciSamples; use PDO; classUserManager { private $conn; public function __construct(PDO $conn) { $this->conn = $conn; } }
  • 11.
    Tá, e senão quiser persistir em banco de dados?
  • 12.
    <?php namespace LcobucciSamples; interface DataStorage {} classDbStorage implements DataStorage {} class FileStorage implements DataStorage {} class FakeStorage implements DataStorage {} class UserManager { private $storage; public function __construct(DataStorage $storage) { $this->storage = $storage; } }
  • 13.
    Formas de injeçãode Dependência ● Construtor ● Setter ● Atributo
  • 14.
    <?php namespace LcobucciSamples; $storage =new DbStorage(); // Constutor $manager = new UserManager($storage); // Setter $manager = new UserManager(); $manager->setStorage($storage); // Atributo $manager = new UserManager(); $manager->storage = $storage;
  • 15.
  • 16.
    Containers ● Criam e armazenam os objetos de acordo com as regras nele definidas ● Possibilitam a separação entre a configuração da criação dos objetos e o uso deles ● Os objetos são denominados “serviços” e cada um possui um identificador único. ● É possível armazenar parâmetros para serem utilizados na construção dos serviços
  • 17.
    Frameworks Devido facilitar aseparação de responsabilidades e manter o código mais limpo e organizado, os frameworks modernos estão trazendo containers de injeção de dependências através de seus componentes. Pimple RespectConfig
  • 18.
  • 19.
    Conclusão... ● Dependency Injection facilita a separação das responsabilidades das suas classes, mantendo baixo o acoplamento entre os componentes ● Podemos utilizar Injeção de dependência independentemente de frameworks e containers
  • 20.
    Obrigado! Eu por aí:http://about.me/lcobucci Slides: http://slideshare.net/lcobucci