Para quê você tem usado Injeção de Dependência(Dependency Injection)?

Também não dá para esquecer do aumento de complexidade, Louds…

Você já viu alguns programas em C++ onde o sujeito faz o seguinte?
(Adaptando para sintaxe java-like)

class Foo<T> extends T { public void bla() { T.doBlah(); } }

Código genérico é complexo. Difícil de manter, difícil de debugar.
E não estou falando só do C++.

É difícil gerenciar tanta abstração e, embora em muitos casos as soluções sejam realmente elegantes, não adianta você ter um time em que o menos capacitado deva ter pelo menos uns 6 ou 8 anos de experiência.

Só para acrescentar, o Spring instrumenta o código à partir da cglib que é muito mais rápido que reflexão. Alguns preocupados com performance, chegaram a compará-lo com o Guice do Google e em sua nova versão, 2.5 , segundo a documentação oficial, está 200% mais rápido que seu concorrente.

Há muitas análises, bastaria uma googlada - http://www.javalobby.org/articles/guice-vs-spring.

Pesssoalmente, em meus projetos (faço uso extensivo do Spring), nunca senti gargalos de performance, pelo contrário.

[]´s

Kenobi.

[quote=ViniGodoy]Também não dá para esquecer do aumento de complexidade, Louds…

Você já viu alguns programas em C++ onde o sujeito faz o seguinte?
(Adaptando para sintaxe java-like)

class Foo<T> extends T { public void bla() { T.doBlah(); } }

Código genérico é complexo. Difícil de manter, difícil de debugar.
E não estou falando só do C++.

É difícil gerenciar tanta abstração e, embora em muitos casos as soluções sejam realmente elegantes, não adianta você ter um time em que o menos capacitado deva ter pelo menos uns 6 ou 8 anos de experiência.[/quote]

Evita muito trabalho de reflexão, por exemplo para construir engines. Costumo muito usar generics para criar camadas versáteis, escrevendo uma única vez.

[quote=pcalcado][quote=louds]
Módulos instanciaveis não se restringe apenas a DI da mesma maneira que generics (generics de verdade, assim como no C#) não se restringe apenas a collections. Quanto aos problemas de configuração, sistemas enormes provavelmente terão um problema semelhante quanto ao tamanho da cola com ambas as técnicas.

DI é uma necessidade quando não é possivel abstrair sobre tipos, simples assim.
[/quote]

Tá, mas falando de DI (que é o tema aqui).

Ok, então o problema não é específico de Java (ou C# ou C++ ou demais linguagens na linha de clonagem) e sim de todo um grupo extenso de possivelmente inclui Lisp, Smalltalk e Scala, certo? Se eu estiver certo comentaria que haver uma solução melor é ótimo mas não faz necessariamente da atual uma coisa ruim. Não é porque uma coisa é melhor que a outra é ruim.[/quote]

Com Smalltalk é possivel criar algo bem próximo a módulos instanciaveis, isso se deve ao fato de ser uma linguagem baseada em troca de mensagens. Scala permite trait types e higher order parametric polymorphism, precisaria pensar em um bom exemplo, mas com Scala é possivel ter todos beneficios de DI sem ter um framework. Uma boa utilidade disso, por exemplo, é quando vc quer testar um tipo e precisa instanciá-lo com mocks ou stubs como dependencias. Usando um framework de DI esse processo é meio chato, se não precisa de DI, fica natural.

Não entendi, java também é baseada em troca de mensagens.

[quote=louds]
Scala permite trait types e higher order parametric polymorphism, precisaria pensar em um bom exemplo, mas com Scala é possivel ter todos beneficios de DI sem ter um framework. Uma boa utilidade disso, por exemplo, é quando vc quer testar um tipo e precisa instanciá-lo com mocks ou stubs como dependencias. Usando um framework de DI esse processo é meio chato, se não precisa de DI, fica natural. [/quote]

Interessante, tem alguma referência? A única cisa relevate que achei no Google é meio contra isso:

Eu tenho impressão que você está jogando o bebê com a água suja mas devo estar errado.

O meu atual projeto usa DI e os seguintes pontos foram considerados:

  • Alternativa de desacoplamento entre cliente e servicos (actions vs servicos, servicos vs entidades, entidades vs daos)
  • Facilitação dos testes unitarios e de integração

No caso de decidir pelo spring:

  • Fácil acesso a documentacao
  • Boa integracao com outros frameworks utilizados
  • Trabalhar somente com servlet containers (no caso o tomcat)
  • Maior gama de recursos (controle de transacoes orientados a aspectos, internacionalizacao, testes de integracao com acesso ao banco de dados, unitarios com mocks, entre outras)

eu gosto de IoC/DI e sempre que possível, utilizo, ainda mais que geralmente meus modelos de domínio são anêmicos (ou seja: não existe entidades/domínicos ricos)

motivos que os utilizo

  • maior facilidade para controle de ciclo de vida dos beans
  • facilidade de implementação de transações/logging com AOP declarativo
  • consegue retirar uma boa parte de código comum, por exemplo, ficar dando new e set
  • tranquilidade no que se diz respeito a integração com outras coisas, por exemplo, não preciso ficar dando lookup em datasource sendo que posso configurar nele
  • se precisar alterar alguma coisa na criação de um bean, não preciso recompilar a classe desde que a alteração não seja de código, mas posso, por exemplo, utilizar um construtor X em vez do Y sem precisar recompilar a aplicação
  • posso integrar com struts, jsf, jpa e afins. Fácil manutenção :stuck_out_tongue:

e assim por diante :slight_smile: