[MÚSICA] [MÚSICA] Olá bem-vindo ao curso de Desenvolvimento Ágil com Padrões de Projetos Eu sou o Clóvis Fernandes e na aula de hoje iremos falar sobre injeção de dependência. O que é isso e quais são os objetivos da injeção de dependência. Vamos começar pela palavra injeção. O que significa injeção? É o ato de injetar, aquilo que é injetado, então o exemplo mais próximo é a injeção, por exemplo, para imunizar contra a gripe, por exemplo. Então você vai injetar a vacina de imunização da gripe dentro do corpo da pessoa. E o que significa então injetar? Significa introduzir, assim como eu introduzo a vacina eu vou introduzir, eu vou inserir, eu vou colocar para dentro, então assim como na vacina a gente coloca a vacina para dentro do corpo humano, nós vamos fazer isso também agora considerando as classes. O que é dependência? Nós temos mostrado ao longo desses cursos uma classe depende da outra por exemplo, a classe consumidor ela usa determinado objeto serviço. Ou seja, para cumprir os seus objetivos, as suas responsabilidades ela depende da classe servidor para cumprir os seus objetivos, as suas responsabilidades. E o que a classe serviço é então? Ela é uma dependência da classe consumidor. Então nós temos que a classe consumidor ela é dependente do serviço, ou seja, a classe consumidor é dependente da dependência. A dependência no caso objeto da classe serviço. Normalmente nós tornamos isso mais claro através de criação de objetos. eu vou criar objetos para consumidor, eu vou criar objetos para o serviço. O que é então injeção de dependência? Na mais é do que a injeção da dependência na classe que depende daquela dependência. Termo que nós costumamos usar muito é uma injeção de dependência inglês, dependency injection ou DI, usando uma sigla DI. Então nós vamos nesses exemplos que têm a ver com injeção de dependência, considerar uma classe consumidor que consome, que usa, que faz uso de uma dependência que é serviço. Então iremos trabalhar com esses dois tipos de classe. Primeiramente, o que eu faço para injetar a dependência? Eu crio a dependência. Segundo, eu vou injetar, inserir essa dependência na classe consumidor. Se essa classe consumidor é criada logo após a criação da dependência eu posso inserir na criação da classe consumidor. Se a classe consumidor já estava criada, por exemplo, aí nós vamos fazer uma inserção diferente, é uma inserção após a classe ter sido criada. Quando eu insiro junto, normalmente a gente chama o tipo da injeção de dependência, a gente chama injeção por construtor. Quando inserimos depois, após, nós vamos usar setter público de consumidor que vai permitir que eu insira aquela dependência. Fazer a injeção da dependência, por construtor ou por setter, não constitui o que a gente está chamando aqui por padrão de injeção de dependência. É uma coisa pouco mais ampla. Nós vamos considerar, pelo menos, três princípios nesse momento para considerar que o padrão de injeção de dependência vai satisfazer. Porque, no final o que nós queremos? Modularizar esse trabalho de injeção de dependência do consumidor, de forma que eu possa colocar a classe consumidor e as suas dependência, no caso nós só estamos com exemplo de dependência, vários contextos. Então ela tem que estar bem definida. Para isso, os três princípios que nós vamos usar serão os seguintes: o primero, vocês lembram que falamos muito do SOLID o princípio correspondente à letra O, corresponde ao Open-Closed Principle. Vocês vejam aí embaixo na figura que o portão está indicando que está aberto, no Open uma hora, depois outra hora pode estar closed. Mas o princípio não, o Open e o Closed, os dois têm que funcionar conjuntamente. O Open é aberto para extensões, então eu tenho uma facilidade de estender pouco a mudança de código, e fechado para modificações, com poucas modificações. Ou seja, ao estender, o objetivo ideal é não ter modificação nenhuma mas no processo de chegar no que a gente chama OCP, Open-Closed Principle quanto menos modificações fizermos, é melhor, o ideal é não fazer modificação nenhuma, a gente estende com facilidade e não modifica quase nada, tá certo. Princípio nada. O outro princípio que nós devemos satisfazer para esse padrão da injeção de dependência ideal corresponde a satisfazer ao LoD, a Law of Demeter, então qual é o princípio? Você enxerga apenas os vizinhos mais próximos, então você não vai falar com vizinhos que estejam distantes, com o vizinho do vizinho, por exemplo, é o que no exemplo a gente está mostrando aí. Eu tenho cliente que depende de consumidor e o consumidor depende do serviço, é o que a gente está mostrando aqui. Mas o cliente também está dependendo do serviço. Ou seja, ele depende do vizinho do vizinho então esse link adicional essa dependência adicional não é bem-vinda. O terceiro princípio é que nós queremos separar a criação das dependências da criação do consumidor. De fato, vocês vejam que aí embaixo eu vou criar a dependência e depois eu vou injetar, por isso que eu já estou separando e isso vai ser bom, que vai ajudar nessa modularização. Nós temos que olhar também o contexto, o contexto é quais são as classes que dependem do consumidor e eventualmente dependem até dos serviços. Nós vamos trabalhar nisso, usando esses três princípios para garantir que você tenha código mais modular, mais fácil de modificar, mais fácil de estender, mais fácil de testar, enfim, código mais limpo. Obrigado! [MÚSICA] [MÚSICA]