Vou tentar descobrir por que o COI pode não ser bom da minha perspectiva.
Como em todo o resto, o contêiner do IOC (ou como Einstein o colocaria I = OC ^ 2) é um conceito que você deve decidir por si mesmo se precisa ou não no seu código. Os protestos recentes sobre o COI são apenas isso, moda. Não caia na moda, isso é o primeiro. Existem inúmeros conceitos por aí que você pode implementar em seu código. Antes de tudo, estou usando a injeção de dependência desde que comecei a programar e aprendi o próprio termo quando foi popularizado com esse nome. O controle de dependência é um assunto muito antigo e foi abordado até agora em trilhões de maneiras, dependendo do que estava se dissociando do que. Separar tudo de tudo é um absurdo. O problema com o contêiner IOC é que ele tenta ser tão útil quanto o Entity Framework ou o NHibernate. Embora escrever um mapeador objeto-relacional seja simplesmente necessário, assim que você tiver que acoplar qualquer banco de dados ao seu sistema, o contêiner IOC nem sempre é necessário. Portanto, quando o contêiner IOC é útil:
- Quando você tem uma situação com muitas dependências, deseja organizar
- Quando você não se preocupa em associar seu código a produtos de terceiros
- Quando seus desenvolvedores querem aprender a trabalhar com uma nova ferramenta
1: Não é tão frequente que você tenha tantas dependências em seu código ou que esteja ciente delas no início do design. O pensamento abstrato é útil quando o pensamento abstrato é devido.
2: Acoplar seu código a um código de terceiros é um problema do HuGe. Eu estava trabalhando com código com mais de 10 anos de idade e que seguia os conceitos sofisticados e avançados ATL, COM, COM + e assim por diante. Não há nada que você possa fazer com esse código agora. O que estou dizendo é que um conceito avançado oferece uma vantagem aparente, mas isso é cancelado a longo prazo com a vantagem desatualizada. Isso havia tornado tudo mais caro.
3: O desenvolvimento de software é bastante difícil. Você pode estendê-lo a níveis irreconhecíveis se permitir que algum conceito avançado seja cortado em seu código. Há um problema com o IOC2. Embora esteja dissociando dependências, está dissociando também o fluxo lógico. Imagine que você encontrou um bug e precisa fazer uma pausa para examinar a situação. O COI2, como qualquer outro conceito avançado, está tornando isso mais difícil. Corrigir um bug dentro de um conceito é mais difícil do que corrigir um bug em um código mais simples, porque quando você corrige um bug, um conceito deve ser obedecido novamente. (Apenas para dar um exemplo, o C ++ .NET está constantemente alterando a sintaxe tanto que você precisa pensar bastante antes de refatorar uma versão mais antiga do .NET.) Então, qual é o problema com o IOC? O problema está na resolução de dependências. A lógica para resolver geralmente está oculta no IOC2, escrito talvez de maneira incomum que você precise aprender e manter. O seu produto de terceiros estará lá em 5 anos? Microsoft não era.
A síndrome "nós sabemos como" está escrita em todo o lugar em relação à IOC2. Isso é semelhante ao teste de automação. Termo extravagante e solução perfeita à primeira vista, basta colocar todos os seus testes para executar durante a noite e ver os resultados pela manhã. É realmente doloroso explicar empresa após empresa o que realmente significa testes automatizados. O teste automatizado definitivamente não é uma maneira rápida de reduzir o número de bugs que você pode introduzir durante a noite para aumentar a qualidade do seu produto. Mas, a moda está tornando essa noção irritantemente dominante. IOC2 sofre a mesma síndrome. Acredita-se que você precise implementá-lo para que seu software seja bom. Toda entrevista recente me perguntaram se estou implementando o IOC2 e a automação. Isso é um sinal de moda: a empresa tinha uma parte do código escrita no MFC que não abandonaria.
Você precisa aprender IOC2 como qualquer outro conceito em software. A decisão se o IOC2 precisar ser usado é da equipe e da empresa. No entanto, pelo menos TODOS os argumentos acima devem ser mencionados antes que a decisão seja tomada. Somente se você vir que o lado positivo supera o lado negativo, poderá tomar uma decisão positiva.
Não há nada de errado com o IOC2, exceto que ele resolve apenas os problemas que resolve e apresenta os problemas que apresenta. Nada mais. No entanto, ir contra a moda é muito difícil, eles têm boca suada, os seguidores de qualquer coisa. É estranho como nenhum deles existe quando o problema com sua fantasia se torna aparente. Muitos conceitos na indústria de software foram defendidos porque geram lucro, livros são escritos, conferências são realizadas, novos produtos são feitos. Isso é moda, geralmente de curta duração. Assim que as pessoas encontram outra coisa, elas a abandonam completamente. O IOC2 é útil, mas mostra os mesmos sinais que muitos outros conceitos desaparecidos que já vi. Não sei se vai sobreviver. Não há regra para isso. Você acha que se for útil, sobreviverá. Não, não é assim. Uma grande empresa rica é suficiente e o conceito pode morrer dentro de algumas semanas. Veremos. O NHibernate sobreviveu, a EF ficou em segundo lugar. Talvez o IOC2 também sobreviva. Não esqueça que a maioria dos conceitos em desenvolvimento de software não tem nada de especial, é muito lógica, simples e óbvia e, às vezes, é mais difícil lembrar a convenção de nomenclatura atual do que entender o próprio conceito. O conhecimento do IOC2 torna um desenvolvedor um desenvolvedor melhor? Não, porque se um desenvolvedor não conseguiu criar um conceito de natureza semelhante ao IOC2, será difícil para ele entender qual problema o IOC2 está resolvendo, usá-lo parecerá artificial e ele poderá começar a usá-lo. por uma questão de ser algum tipo de politicamente correto. Não esqueça que a maioria dos conceitos em desenvolvimento de software não tem nada de especial, é muito lógica, simples e óbvia e, às vezes, é mais difícil lembrar a convenção de nomenclatura atual do que entender o próprio conceito. O conhecimento do IOC2 torna um desenvolvedor um desenvolvedor melhor? Não, porque se um desenvolvedor não conseguiu criar um conceito de natureza semelhante ao IOC2, será difícil para ele entender qual problema o IOC2 está resolvendo, usá-lo parecerá artificial e ele poderá começar a usá-lo. por uma questão de ser algum tipo de politicamente correto. Não esqueça que a maioria dos conceitos em desenvolvimento de software não tem nada de especial, é muito lógica, simples e óbvia e, às vezes, é mais difícil lembrar a convenção de nomenclatura atual do que entender o próprio conceito. O conhecimento do IOC2 torna um desenvolvedor um desenvolvedor melhor? Não, porque se um desenvolvedor não conseguiu criar um conceito de natureza semelhante ao IOC2, será difícil para ele entender qual problema o IOC2 está resolvendo, usá-lo parecerá artificial e ele poderá começar a usá-lo. por uma questão de ser algum tipo de politicamente correto. O conhecimento do IOC2 torna um desenvolvedor um desenvolvedor melhor? Não, porque se um desenvolvedor não conseguiu criar um conceito de natureza semelhante ao IOC2, será difícil para ele entender qual problema o IOC2 está resolvendo, usá-lo parecerá artificial e ele poderá começar a usá-lo. por uma questão de ser algum tipo de politicamente correto. O conhecimento do IOC2 torna um desenvolvedor um desenvolvedor melhor? Não, porque se um desenvolvedor não conseguiu criar um conceito de natureza semelhante ao IOC2, será difícil para ele entender qual problema o IOC2 está resolvendo, usá-lo parecerá artificial e ele poderá começar a usá-lo. por uma questão de ser algum tipo de politicamente correto.