SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

12 factor in the PHP world
12 factor in the PHP world12 factor in the PHP world
12 factor in the PHP worldElton Minetto
 
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 Edgar Dantas
 
Desenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterDesenvolvimento web com CodeIgniter
Desenvolvimento web com CodeIgniterPedro 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 InterfacesVitor Silva
 
Modernizando projetos legados usando APIs
Modernizando projetos legados usando APIsModernizando projetos legados usando APIs
Modernizando projetos legados usando APIsElton Minetto
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascriptLucas Aquiles
 
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 ProgramarTiago Antônio da Silva
 
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 IVJoão Helis Bernardo
 
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 é AngularJsRubens Fernandes
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011Evaldo Junior
 
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 UTFPRAndré Luiz Forchesatto
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao dockerBenicio Ávila
 
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)Rafael Oliveira
 

La actualidad más candente (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)
 

Destacado

Fist Global Initiative Presentation
Fist Global Initiative PresentationFist Global Initiative Presentation
Fist Global Initiative PresentationShan Kane
 
Tourism Local Economic Development Project
Tourism Local Economic Development ProjectTourism Local Economic Development Project
Tourism Local Economic Development ProjectMarinda Holtzhausen
 
jQuery básico (parte 2)
jQuery básico (parte 2)jQuery básico (parte 2)
jQuery básico (parte 2)Luís Cobucci
 
Qwizdom in the classroom
Qwizdom in the classroomQwizdom in the classroom
Qwizdom in the classroomcarp8dm
 
Procesy pads en
Procesy pads enProcesy pads en
Procesy pads enFero Kocun
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)Luís Cobucci
 
Fist Vss Source Code Management Techniques
Fist Vss Source Code Management TechniquesFist Vss Source Code Management Techniques
Fist Vss Source Code Management TechniquesShan Kane
 
Metodo de estudio ecci
Metodo de estudio ecciMetodo de estudio ecci
Metodo de estudio eccisaulroa
 
international investment and collaborative ventures (fdi)
international investment and collaborative ventures (fdi)international investment and collaborative ventures (fdi)
international investment and collaborative ventures (fdi)Wirda Hanim
 
Microsoft2013-BI-Overview-print
Microsoft2013-BI-Overview-printMicrosoft2013-BI-Overview-print
Microsoft2013-BI-Overview-printShan Kane
 
Three Kinds of Consumers
Three Kinds of ConsumersThree Kinds of Consumers
Three Kinds of ConsumersYvette Guinanao
 
JWT - To authentication and beyond!
JWT - To authentication and beyond!JWT - To authentication and beyond!
JWT - To authentication and beyond!Luís Cobucci
 
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 developmentWirda Hanim
 
Internet argazkiak musika
Internet argazkiak musikaInternet argazkiak musika
Internet argazkiak musikaleiretxu_lopez
 
JORMI - Jornal Missionário n° 93
JORMI - Jornal Missionário n° 93JORMI - Jornal Missionário n° 93
JORMI - Jornal Missionário n° 93Almir Rodrigues
 
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-12Athlon S.Coop.
 

Destacado (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
 

Similar a Dependency Injection WTF

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 2011Luís Cobucci
 
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 CERTOPerla Coutinho Barbosa
 
(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012(Re)pensando a OOP - TDC 2012
(Re)pensando a OOP - TDC 2012Luís Cobucci
 
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 2011Luís Cobucci
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
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 FrameworkPablo Dall'Oglio
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol Gyn(Re)pensando a OOP - Flisol Gyn
(Re)pensando a OOP - Flisol GynLuís Cobucci
 
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 trabalhoCaio Lima
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com PythonLuiz Aldabalde
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com PythonPythOnRio
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitFlávio Lisboa
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 

Similar a Dependency Injection WTF (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

  • 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