dependency injection wtf? - phpsc conference 2012
Post on 18-Nov-2014
627 Views
Preview:
DESCRIPTION
TRANSCRIPT
Dependency Injection, WTF?
Dependency Injection, WTF?
Luís Otávio Cobucci Oblonczyk
27 de Outubro de 2012
Luís Otávio Cobucci OblonczykLuí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 OOPMandamento principal da OOP
“Alta coesão e baixo acoplamento”
Problemas do alto acoplamentoProblemas 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?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...
<?phpnamespace Lcobucci\Samples;
use \PDO;
class UserManager{ private $conn;
public function __construct() { $this->conn = new PDO( 'mysql:dbname=test;host=localhost', 'root', 'root' ); }}
<?phpnamespace Lcobucci\Samples;
use \PDO;
class UserManager{ private $conn;
public function __construct($dsn, $user, $pass) { $this->conn = new PDO( $dsn, $user, $pass ); }}
<?phpnamespace Lcobucci\Samples;
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?
<?phpnamespace Lcobucci\Samples;
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ênciaFormas de injeção de Dependência● Construtor● Setter● Atributo
<?phpnamespace Lcobucci\Samples;
$storage = new DbStorage();
// Constutor$manager = new UserManager($storage);
// Setter$manager = new UserManager();
$manager->setStorage($storage);
// Atributo$manager = new UserManager();
$manager->storage = $storage;
Containers!
ContainersContainers
● 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
FrameworksFrameworks
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 Respect\Config
Lembrem-se
Conclusão...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!Obrigado!
Eu por aí: http://about.me/lcobucci
Slides: http://slideshare.net/lcobucci
top related