Como explicar a injeção de dependência para uma criança de 5 anos? [fechadas]

208

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?

user198313
fonte
72
Parece que aquele garoto de dentro para uma vida dura ...
ire_and_curses
24
Comece com "Era uma vez ..."
Martin
1
Estamos falando de um iniciante em Java ou de um literal de cinco anos?
Tirou
2
# Dependency injeção # don' dependem da idade do aluno, Ele é o mesmo para cada um
Rakesh Juyal
2
Rakesh: O vídeo introdutório do JavaOne 2009 baseia-se na premissa de que mesmo um garoto de 13 anos pode ser um desenvolvedor Java, porque o Java é "em toda parte" e "fácil".
Esko

Respostas:

789

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.

John Munsch
fonte
93

Que tal isso?

Se você tem uma classe Employeee esse funcionário tem uma, Address você pode Employeedefini-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 Employeeinstância, você precisa de uma Addressinstâ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 Departmentatributo:

  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 Departmentobjeto 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 setAddressou 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 Employeeclasse, poderá injetar simulação Addresse Departmentsobjetos sem precisar codificar todo o conjunto / obter para todo o seu teste. Ainda melhor, você pode injetar objetos reais Address e Departmentno 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.

OscarRyz
fonte
3
Ou: injeções de dependência é quando você tem algo definindo as dependências para você. Isso geralmente é uma estrutura. :)
OscarRyz 28/10/09
2
realmente muito inteligente.
OscarRyz 28/10/09
24

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.

Ned Batchelder
fonte
10

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.

DigitalRoss
fonte
7

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.

WW.
fonte
5
Isso soa mais como uma descrição de interfaces ou polimorfismo, mas eu lhe dou crédito por ser realmente compreensível para uma criança de 5 anos.
Natix