Meus 2 centavos ...
Sim e não.
Você nunca deve realmente violar os princípios que adota; mas seus princípios sempre devem ser sutis e adotados em serviço a uma meta mais alta. Portanto, com um entendimento adequadamente condicionado, algumas violações aparentes podem não ser violações reais do "espírito" ou "corpo de princípios como um todo".
Os princípios do SOLID, em particular, além de exigir muitas nuances, acabam subservientes ao objetivo de "fornecer software funcional e sustentável". Portanto, aderir a qualquer princípio específico do SOLID é autodestrutivo e contraditório ao fazer isso em conflito com os objetivos do SOLID. E aqui, muitas vezes, observo que entregar a manutenção de trunfos .
Então, e o D no SOLID ? Bem, isso contribui para o aumento da capacidade de manutenção, tornando seu módulo reutilizável relativamente independente do seu contexto. E podemos definir o "módulo reutilizável" como "uma coleção de códigos que você planeja usar em outro contexto distinto". E isso se aplica a uma única função, classe, conjunto de classes e programas.
E sim, alterar as implementações do criador de logs provavelmente coloca seu módulo em "outro contexto distinto".
Então, deixe-me oferecer minhas duas grandes advertências :
Primeiro: desenhar as linhas em torno dos blocos de código que constituem "um módulo reutilizável" é uma questão de julgamento profissional. E seu julgamento é necessariamente limitado à sua experiência.
Se atualmente você não planeja usar um módulo em outro contexto, provavelmente não há problema em depender indefesamente dele. A ressalva a ressalva: Seus planos são provavelmente errado - mas isso é também OK. Quanto mais você escrever módulo após módulo, mais intuitivo e preciso será o seu senso de se "eu vou precisar disso novamente algum dia". Mas você provavelmente nunca será capaz de dizer retrospectivamente: "Modifiquei e desacoperei tudo da melhor maneira possível, mas sem excesso ".
Se você se sentir culpado por seus erros de julgamento, vá para a confissão e siga em frente ...
Em segundo lugar: inverter o controle não equivale a injetar dependências .
Isso é especialmente verdade quando você começa a injetar dependências ad nauseam . A injeção de dependência é uma tática útil para a estratégia abrangente de IoC. Mas eu argumentaria que o DI é de menor eficácia do que algumas outras táticas - como o uso de interfaces e adaptadores - pontos únicos de exposição ao contexto a partir do módulo.
E vamos realmente focar nisso por um segundo. Porque, mesmo se você injetar um Logger
anúncio nauseam , precisará escrever um código na Logger
interface. Não foi possível começar a usar um novo Logger
de um fornecedor diferente que aceita parâmetros em uma ordem diferente. Essa capacidade vem da codificação, dentro do módulo, de uma interface que existe dentro do módulo e que possui um único submódulo (adaptador) para gerenciar a dependência.
E se você estiver codificando em um Adaptador, se ele Logger
é injetado ou descoberto pelo Adaptador é geralmente bastante insignificante para o objetivo geral de manutenção. E o mais importante, se você possui um adaptador no nível do módulo, provavelmente é um absurdo injetá-lo em qualquer coisa. Está escrito para o módulo.
tl; dr - Pare de se preocupar com princípios sem considerar o motivo pelo qual você está usando os princípios. E, mais praticamente, basta criar um Adapter
para cada módulo. Use seu julgamento ao decidir onde você desenha os limites do "módulo". De dentro de cada módulo, vá em frente e consulte diretamente o Adapter
. E, com certeza, injete o logger real no Adapter
- mas não em todas as pequenas coisas que possam precisar dele.