Qual é uma boa maneira de explicar a injeção de dependência ?
Encontrei vários tutoriais no Google, mas nenhum deles que suponha que o leitor é apenas um iniciante em Java. Como você explicaria isso a um novato?
Qual é uma boa maneira de explicar a injeção de dependência ?
Encontrei vários tutoriais no Google, mas nenhum deles que suponha que o leitor é apenas um iniciante em Java. Como você explicaria isso a um novato?
Respostas:
Dou injeção de dependência para crianças de cinco anos.
Quando você tira as coisas da geladeira, pode causar problemas. Você pode deixar a porta aberta, pode conseguir algo que mamãe ou papai não querem que você tenha. Você pode até estar procurando por algo que nem sequer temos ou que expirou.
O que você deve fazer é declarar uma necessidade: "Preciso beber alguma coisa no almoço" e, em seguida, garantiremos que você tenha alguma coisa quando se sentar para comer.
Que tal isso?
Se você tem uma classe Employee
e esse funcionário tem uma, Address
você pode Employee
defini-la da seguinte maneira:
class Employee {
private Address address;
// constructor
public Employee( Address newAddress ) {
this.address = newAddress;
}
public Address getAddress() {
return this.address;
}
public void setAddress( Address newAddress ) {
this.address = newAddress;
}
}
Tudo parece bem até agora.
Este código mostra um relacionamento HAS-A entre o funcionário e o endereço dele, tudo bem.
Agora, esse relacionamento HAS-A criou uma dependência entre eles. O problema vem dentro do construtor.
Cada vez que você deseja criar uma Employee
instância, você precisa de uma Address
instância:
Address someAddress = ....
Employee oscar = new Employee( someAddress );
Trabalhar dessa maneira se torna problemático, especialmente quando você deseja executar testes de unidade.
O principal problema vem quando você precisa testar um determinado objeto, você precisa criar uma instância de outro objeto, e, provavelmente, você precisa criar uma instância de ainda outra objeto para fazer isso. A corrente pode se tornar incontrolável.
Para evitar isso, você pode alterar o construtor assim:
public Employee(){
}
Usando um construtor no args.
Depois, você pode definir o endereço quando quiser:
Address someAddress = ....
Employee oscar = new Employee();
oscar.setAddress( someAddress );
Agora, isso pode ser uma chatice, se você tiver vários atributos ou se for difícil criar objetos.
No entanto, pense sobre isso, digamos, você adiciona o Department
atributo:
class Employee {
private Address address;
private Department department;
....
Se você possui 300 funcionários e todos precisam ter o mesmo departamento, e mais esse mesmo departamento precisa ser compartilhado entre outros objetos (como a lista de departamentos da empresa ou as funções de cada departamento, etc.), você tenha dificuldade com a visibilidade do Department
objeto e compartilhe-o através de toda a rede de objetos.
O que é a Injeção de Dependências para ajudar você a "injetar" essas dependências no seu código. A maioria das estruturas permite que você faça isso especificando em um arquivo externo qual objeto deve ser injetado.
Suponha um arquivo de propriedades para um injetor de dependência fictício:
#mock employee
employee.address = MockAddress.class
employee.department = MockDepartment.class
#production setup
employee.address = RealAddress.class
employee.department = RealDepartment.class
Você definirá o que injetar para um determinado cenário.
O que a estrutura do Injector de Dependência fará é definir os objetos corretos para você, para que você não precise codificar setAddress
ou setDepartment
. Isso seria feito por reflexão ou por geração de código ou outras técnicas.
Portanto, da próxima vez que você precisar testar a Employee
classe, poderá injetar simulação Address
e Departments
objetos sem precisar codificar todo o conjunto / obter para todo o seu teste. Ainda melhor, você pode injetar objetos reais Address
e Department
no código de produção e ainda ter a confiança de que seu código funciona como testado.
É praticamente isso.
Ainda não acho que essa explicação seja adequada para crianças de 5 anos, conforme solicitado.
Espero que você ainda ache útil.
Ao escrever uma classe, é natural que ela faça uso de outros objetos. Você pode ter uma conexão com o banco de dados, por exemplo, ou algum outro serviço que você usa. Esses outros objetos (ou serviços) são dependências. A maneira mais simples de escrever o código é simplesmente criar e usar esses outros objetos. Mas isso significa que seu objeto tem um relacionamento inflexível com essas dependências: não importa por que você esteja chamando seu objeto, ele usa as mesmas dependências.
Uma técnica mais poderosa é poder criar seu objeto e fornecer dependências para ele usar. Portanto, você pode criar uma conexão com o banco de dados para usá-la e entregá-la ao seu objeto. Dessa forma, você pode criar seu objeto com diferentes dependências em momentos diferentes, tornando seu objeto mais flexível. Isso é injeção de dependência, onde você "injeta" as dependências no objeto.
BTW: No estilo moderno de apresentação do uso de fotos do flickr para ilustrar conceitos, isso pode ser ilustrado com um viciado em drogas. Oh, espere, isso é dependência de injeção ... OK, desculpe, piada de mau gosto.
Não conheço nenhum tutorial simplificado, mas posso fornecer uma versão de quase 25 palavras ou menos:
Com a injeção de dependência, um objeto não configura seus próprios componentes com base em coisas que já conhece, mas o objeto é configurado por uma lógica de nível superior e, em seguida, chama componentes dos quais não tinha conhecimento prévio incorporado. A idéia é tornar o objeto mais de um componente e menos de um aplicativo, realocando tarefas de configuração em um nível superior. Isso aumenta a probabilidade de o objeto ser útil no futuro ou com uma configuração diferente.
É melhor para testes, é melhor quando chega a hora de revisar o aplicativo. Uma implementação típica coloca a configuração em XML e usa uma estrutura para carregar dinamicamente classes.
Ao receber um novo Nintendo, você pode simplesmente usar os botões e a tela sensível ao toque para jogar.
Mas na fábrica da Nintendo, eles precisam saber como montar um.
Quando as pessoas inteligentes da fábrica lançarem um Nintendo DS, será diferente por dentro, mas você ainda saberá como usá-lo.