Thiago Cantero

Tecnologia e Entretenimento

Arquitetura de SoftwarePHP

Conceitos: Inversão de Controle e Injeção de Dependência.

Olá, mundo! Tudo bem? Um pouco sumido por estes dias…

Hoje trago um conceito bem interessante da Arquitetura de Software muito presente na utilização de Frameworks, seja qual for a linguagem, a Inversão de Controle, e a Injeção de Dependências.

Introdução

Ao desenvolver uma aplicação ela atende a um determinado grupo restrito, no entanto poderá vir a sofrer uma escalabilidade para um número maior de processos, que envolvem mudanças significativas e tem de possuir maneiras de dar extensão para o crescimento satisfatório.

Quando trabalhamos com um Framework utilizamos um acoplamento concreto com as classes que produzem resultados diversos de nossa aplicação, por exemplo um ORM realizando o acesso e manipulação, atuando na camada do Banco de Dados, são alguns exemplos de Injeção de Dependência e Inversão de Controle.

Vamos ao Trabalho\\

A inversão de controle é uma parte fundamental do que torna um framework diferente de uma biblioteca. Uma biblioteca é essencialmente um conjunto de funções que você pode chamar, hoje em dia geralmente organizada em classes. Cada chamada faz algum trabalho e retorna o controle ao cliente. Martin Fowler

O que podemos vislumbrar com a citação de Martin Fowler é de que ao utilizarmos um Framework estamos o tempo todo este conceito, juntamente com a injeção de dependências.

Vejamos um exemplo em PHP:

IoC.php

<?php
/**   
 * IoC - Inversion of Controller - Inversão de Controle" 
 * @version 1.0   
 * @package IoC
 * @author Thiago Cantero Mari Monteiro   
 * @copyright Copyright (c) 2022 Thiago Cantero Mari Monteiro   
 * @license http://www.thiagocantero.com.br/sobre  
 **/


//Classe Mãe que irá manipular as demais classes
class ClasseA
{
    public $ClasseB;
    public $ClasseC;
    public function ClasseA()
    {
        echo "<h2 style='color:blue'> Inicialização da Classe A </h2>";
    }
    public function metodo()
    {
        $this->ClasseB = new ClasseB();
        $this->ClasseC = new ClasseC();
        $this->ClasseB->metodo();
        $this->ClasseC->metodo();
    }
}

//Estabelece a Classe B
class ClasseB
{
    public function ClasseB()
    {
        echo "<h2 style='color:purple'> Inicialização da Classe B </h2>";
    }
    public function metodo()
    {
        echo "<h3 style='color:purple'> A saída da Classe B </h3>";
    }
}

//Estabelece a Classe C
class ClasseC
{
    public function ClasseC()
    {
        echo "<h2 style='color:red'> Inicialização da Classe C </h2>";
    }
    public function metodo()
    {
        echo "<h3 style='color:red'> A saída da Classe C </h3>";
    }
}

//Cria o Objeto da Classe A
$objeto = new ClasseA();
//Faz a chamada da função metodo() 
$objeto->metodo();

Agora, na pasta do seu projeto, execute o comando:

php -S localhost:8000

No código, é perceptível que a Classe A possui uma Função Pública que manipula o comportamento das demais Classes (B e C), por ela ter a definição desta em sua composição, realizando assim a Inversão de Controle.

Injeção de dependência (Dependency Injection, em inglês) é um padrão de desenvolvimento de programas de computadores utilizado quando é necessário manter baixo o nível de acoplamento entre diferentes módulos de um sistema. Nesta solução as dependências entre os módulos não são definidas programaticamente, mas sim pela configuração de uma infraestrutura de software (container) que é responsável por “injetar” em cada componente suas dependências declaradas. A Injeção de dependência se relaciona com o padrão Inversão de controle mas não pode ser considerada um sinônimo deste. Wikipedia

DI.php

<?php
/**   
 * DI - Denpendency Injection - Injeção de Dependência" 
 * @version 1.0   
 * @package DI
 * @author Thiago Cantero Mari Monteiro   
 * @copyright Copyright (c) 2022 Thiago Cantero Mari Monteiro   
 * @license http://www.thiagocantero.com.br/sobre  
 **/


class Funcionario {
   private $habilidades;
   public function __construct($habilidades){
      $this->habilidades = $habilidades;
   }
   public function contaHabilidades(){
      return count($this->habilidades);
   }
}
$criarHabilidades = array("Digitador", "Supervisor", "Logística", "Inglês Fluente");
$funcionario = new Funcionario($criarHabilidades);
echo "O número total de habilidades do Funcionário é(são): ". $funcionario->contaHabilidades();

Conforme podemos observar neste código, iniciamos declarando uma variável privada (habilidades) e logo após injetamos ela no método construtor da classe, definimos a criação do objeto com a palavra reservada $this.

Após termos criado o Objeto, criamos uma Função Pública que conta as habilidades do funcionário, que serão criadas em um array (linha 21), e posteriormente criaremos o objeto, que retorna, no nosso exemplo, o número quatro, pois há quatro valores dentro de nosso array.

Existem várias maneiras de Injeção de Dependências que usamos muito, por exemplo aplicando o conceito MVC, quando chamamos uma Classe de Modelo (Camada de Abstração do Banco de Dados), injetamos esse Classe em nosso Controller.

Como sempre recomendo o profundo estudo e prática para o entendimento e aplicação dos conceitos, e é de suma importância entender como os frameworks trabalham, pois saberemos com exatidão onde está ocorrendo uma falha e/ou gargalo da aplicação, por exemplo.

Por fim uma recomendação, a obra de Uncle Bob Clean Code um dos precursores do assunto.

Por hoje é só, até mais! ; )

Código fonte no Github.

 

 

Temos que ser continuamente lembrados daquilo em que acreditamos