Eu suspeito que cometi um erro de estudante aqui e estou procurando esclarecimentos. Muitas das classes na minha solução (C #) - ouso dizer a maioria - acabei escrevendo uma interface correspondente. Por exemplo, uma interface "ICalculator" e uma classe "Calculator" que a implementa, mesmo que eu nunca substitua essa calculadora por uma implementação diferente. Além disso, a maioria dessas classes reside no mesmo projeto que suas dependências - elas realmente precisam apenas estar internal
, mas acabaram sendo public
um efeito colateral da implementação de suas respectivas interfaces.
Eu acho que essa prática de criar interfaces para tudo resultou de algumas falsidades:
1) Originalmente, pensei que uma interface era necessária para criar simulações de teste de unidade (estou usando o Moq), mas desde então descobri que uma classe pode ser ridicularizada se seus membros forem virtual
e tem um construtor sem parâmetros (corrija-me se Estou errado).
2) Originalmente, pensei que uma interface era necessária para registrar uma classe na estrutura de IoC (Castle Windsor), por exemplo
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
quando na verdade eu poderia simplesmente registrar o tipo concreto contra ele mesmo:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) O uso de interfaces, por exemplo, parâmetros do construtor para injeção de dependência, resulta em "acoplamento frouxo".
Então, eu fiquei louco com interfaces ?! Estou ciente dos cenários em que você "normalmente" usaria uma interface, por exemplo, expondo uma API pública ou para coisas como a funcionalidade "conectável". Minha solução possui um pequeno número de classes que se encaixam nesses casos de uso, mas gostaria de saber se todas as outras interfaces são desnecessárias e devem ser removidas? Em relação ao ponto 3) acima, não estarei violando o "acoplamento solto" se eu fizer isso?
Edit : - Estou apenas brincando com o Moq, e parece exigir que os métodos sejam públicos e virtuais e tenham um construtor público sem parâmetros, para poder zombar deles. Então parece que não posso ter aulas internas?