Je soupçonne que j'ai fait une erreur d'écolier ici, et je cherche des éclaircissements. Beaucoup de classes dans ma solution (C #) - j'ose dire la majorité - j'ai fini par écrire une interface correspondante pour. Par exemple, une interface "ICalculator" et une classe "Calculator" qui l'implémente, même si je ne remplacerai probablement jamais cette calculatrice par une implémentation différente. De plus, la plupart de ces classes résident dans le même projet que leurs dépendances - elles n'ont vraiment besoin d'être internal
, mais ont fini par être public
un effet secondaire de la mise en œuvre de leurs interfaces respectives.
Je pense que cette pratique de créer des interfaces pour tout découle de quelques mensonges: -
1) Je pensais à l'origine qu'une interface était nécessaire pour créer des simulations de test unitaire (j'utilise Moq), mais j'ai depuis découvert qu'une classe peut être moquée si ses membres le sont virtual
, et elle a un constructeur sans paramètre (corrigez-moi si J'ai tort).
2) Je pensais à l'origine qu'une interface était nécessaire pour enregistrer une classe avec le framework IoC (Castle Windsor), par exemple
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
alors qu'en fait je pouvais simplement enregistrer le type concret contre lui-même:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) L'utilisation d'interfaces, par exemple les paramètres du constructeur pour l'injection de dépendances, entraîne un "couplage lâche".
Alors suis-je devenu fou avec les interfaces?! Je connais les scénarios où vous utiliseriez "normalement" une interface, par exemple en exposant une API publique, ou pour des choses comme la fonctionnalité "enfichable". Ma solution a un petit nombre de classes qui correspondent à de tels cas d'utilisation, mais je me demande si toutes les autres interfaces ne sont pas nécessaires et devraient être supprimées? En ce qui concerne le point 3) ci-dessus, ne violerai-je pas le "couplage lâche" si je le faisais?
Edit : - Je suis juste en train de jouer avec Moq, et il semble que les méthodes soient publiques et virtuelles, et aient un constructeur public sans paramètre, pour pouvoir se moquer d'eux. Il semble donc que je ne puisse pas avoir de classes internes alors?