SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniter
Pedro Junior
 
Desenvolvimento em .Net - Herança e Interfaces
Desenvolvimento em .Net - Herança e InterfacesDesenvolvimento em .Net - Herança e Interfaces
Desenvolvimento em .Net - Herança e Interfaces
Vitor Silva
 

Was ist angesagt? (20)

12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP world
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Apresentação zend framework 2 parte 1
Apresentação zend framework 2   parte 1 Apresentação zend framework 2   parte 1
Apresentação zend framework 2 parte 1
 
Node JS - Parte 1
Node JS - Parte 1Node JS - Parte 1
Node JS - Parte 1
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniter
 
Aula02 - JavaScript
Aula02 - JavaScriptAula02 - JavaScript
Aula02 - JavaScript
 
Desenvolvimento em .Net - Herança e Interfaces
Desenvolvimento em .Net - Herança e InterfacesDesenvolvimento em .Net - Herança e Interfaces
Desenvolvimento em .Net - Herança e Interfaces
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIs
 
Spa com Vue.js
Spa com Vue.jsSpa com Vue.js
Spa com Vue.js
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascript
 
Curso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como ProgramarCurso JavaScript - Aula de Introdução como Programar
Curso JavaScript - Aula de Introdução como Programar
 
Backbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IV
Backbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IVBackbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IV
Backbone.js - Desenvolvimento de Sistemas Corporativos - UFPB - Campus IV
 
Breve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJsBreve explicação sobre o que é AngularJs
Breve explicação sobre o que é AngularJs
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
Aula Introdução a VRaptor 4 - Pós Java UTFPR
Aula Introdução a VRaptor 4 - Pós Java UTFPRAula Introdução a VRaptor 4 - Pós Java UTFPR
Aula Introdução a VRaptor 4 - Pós Java UTFPR
 
Aula06 - JavaScript
Aula06 - JavaScriptAula06 - JavaScript
Aula06 - JavaScript
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao docker
 
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
Infoeste 2014 - Desenvolvimento de um CMS com Codeigniter Framework(PHP)
 

Andere mochten auch

Fist Global Initiative Presentation
Fist Global Initiative PresentationFist Global Initiative Presentation
Fist Global Initiative Presentation
Shan Kane
 
Procesy pads en
Procesy pads enProcesy pads en
Procesy pads en
Fero Kocun
 
Fist Vss Source Code Management Techniques
Fist Vss Source Code Management TechniquesFist Vss Source Code Management Techniques
Fist Vss Source Code Management Techniques
Shan Kane
 
Microsoft2013-BI-Overview-print
Microsoft2013-BI-Overview-printMicrosoft2013-BI-Overview-print
Microsoft2013-BI-Overview-print
Shan Kane
 
Three Kinds of Consumers
Three Kinds of ConsumersThree Kinds of Consumers
Three Kinds of Consumers
Yvette Guinanao
 

Andere mochten auch (20)

Fist Global Initiative Presentation
Fist Global Initiative PresentationFist Global Initiative Presentation
Fist Global Initiative Presentation
 
Tourism Local Economic Development Project
Tourism Local Economic Development ProjectTourism Local Economic Development Project
Tourism Local Economic Development Project
 
Html - textos
Html - textosHtml - textos
Html - textos
 
jQuery básico (parte 2)
jQuery básico (parte 2)jQuery básico (parte 2)
jQuery básico (parte 2)
 
Qwizdom in the classroom
Qwizdom in the classroomQwizdom in the classroom
Qwizdom in the classroom
 
Scala en
Scala enScala en
Scala en
 
Procesy pads en
Procesy pads enProcesy pads en
Procesy pads en
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)
 
Fist Vss Source Code Management Techniques
Fist Vss Source Code Management TechniquesFist Vss Source Code Management Techniques
Fist Vss Source Code Management Techniques
 
Make it SOLID!
Make it SOLID!Make it SOLID!
Make it SOLID!
 
Metodo de estudio ecci
Metodo de estudio ecciMetodo de estudio ecci
Metodo de estudio ecci
 
international investment and collaborative ventures (fdi)
international investment and collaborative ventures (fdi)international investment and collaborative ventures (fdi)
international investment and collaborative ventures (fdi)
 
Microsoft2013-BI-Overview-print
Microsoft2013-BI-Overview-printMicrosoft2013-BI-Overview-print
Microsoft2013-BI-Overview-print
 
Three Kinds of Consumers
Three Kinds of ConsumersThree Kinds of Consumers
Three Kinds of Consumers
 
JWT - To authentication and beyond!
JWT - To authentication and beyond!JWT - To authentication and beyond!
JWT - To authentication and beyond!
 
Islamic perspectives on hrm training and development
Islamic perspectives on hrm training and developmentIslamic perspectives on hrm training and development
Islamic perspectives on hrm training and development
 
Internet argazkiak musika
Internet argazkiak musikaInternet argazkiak musika
Internet argazkiak musika
 
Casa branca
Casa brancaCasa branca
Casa branca
 
JORMI - Jornal Missionário n° 93
JORMI - Jornal Missionário n° 93JORMI - Jornal Missionário n° 93
JORMI - Jornal Missionário n° 93
 
Programa del servicio de deportes de MU 2011-12
Programa del servicio de deportes de MU 2011-12Programa del servicio de deportes de MU 2011-12
Programa del servicio de deportes de MU 2011-12
 

Ähnlich wie Dependency injection WTF? - PHPSC Conference 2012

Odi tutorial configuração repositórios mestre e trabalho
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalho
Caio Lima
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 

Ähnlich wie Dependency injection WTF? - PHPSC Conference 2012 (20)

Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTOPDO: TRABALHANDO COM BANCO DO JEITO CERTO
PDO: TRABALHANDO COM BANCO DO JEITO CERTO
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012
 
Palestra
PalestraPalestra
Palestra
 
Aula1
Aula1Aula1
Aula1
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn
 
Odi tutorial configuração repositórios mestre e trabalho
Odi tutorial   configuração repositórios mestre e trabalhoOdi tutorial   configuração repositórios mestre e trabalho
Odi tutorial configuração repositórios mestre e trabalho
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com Python
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com Python
 
Solid
SolidSolid
Solid
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo Toolkit
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 

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 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
  • 3. Mandamento principal da OOP “Alta coesão e baixo acoplamento”
  • 4. Problemas do alto acoplamento ● Dificuldade de testabilidade ● Demora para entender o código ● Manutenção do código ● Baixa extensibilidade ● Impossibilidade de reutilização
  • 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
  • 8. <?php namespace LcobucciSamples; use PDO; class UserManager { private $conn; public function __construct() { $this->conn = new PDO( 'mysql:dbname=test;host=localhost', 'root', 'root' ); } }
  • 9. <?php namespace LcobucciSamples; use PDO; class UserManager { private $conn; public function __construct($dsn, $user, $pass) { $this->conn = new PDO( $dsn, $user, $pass ); } }
  • 10. <?php namespace LcobucciSamples; use PDO; class UserManager { private $conn; public function __construct(PDO $conn) { $this->conn = $conn; } }
  • 11. Tá, e se não quiser persistir em banco de dados?
  • 12. <?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; } }
  • 13. Formas de injeção de 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;
  • 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 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
  • 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