Ich vermute, ich habe hier einen Schülerfehler gemacht und suche nach einer Klärung. Viele der Klassen in meiner Lösung (C #) - ich wage es, die Mehrheit zu sagen - haben am Ende eine entsprechende Schnittstelle für geschrieben. ZB eine "ICalculator" -Schnittstelle und eine "Calculator" -Klasse, die sie implementiert, obwohl ich diesen Rechner wahrscheinlich nie durch eine andere Implementierung ersetzen werde. Außerdem befinden sich die meisten dieser Klassen im selben Projekt wie ihre Abhängigkeiten - sie müssen es wirklich nur sein internal
, sind aber letztendlich public
ein Nebeneffekt bei der Implementierung ihrer jeweiligen Schnittstellen.
Ich denke, diese Praxis, Schnittstellen für alles zu schaffen, ist auf ein paar Lügen zurückzuführen:
1) Ich dachte ursprünglich, dass eine Schnittstelle notwendig ist, um Unit-Test-Mocks zu erstellen (ich verwende Moq), aber seitdem habe ich herausgefunden, dass eine Klasse verspottet werden kann, wenn ihre Mitglieder sind virtual
, und dass sie einen parameterlosen Konstruktor hat (korrigieren Sie mich, wenn Ich liege falsch).
2) Ich dachte ursprünglich, dass eine Schnittstelle notwendig ist, um eine Klasse beim IoC-Framework (Castle Windsor) zu registrieren, z
Container.Register(Component.For<ICalculator>().ImplementedBy<Calculator>()...
in der Tat konnte ich nur den konkreten Typ gegen sich selbst registrieren:
Container.Register(Component.For<Calculator>().ImplementedBy<Calculator>()...
3) Die Verwendung von Schnittstellen, z. B. Konstruktorparametern für die Abhängigkeitsinjektion, führt zu einer "losen Kopplung".
Also bin ich verrückt nach Schnittstellen geworden ?! Mir sind die Szenarien bekannt, in denen Sie "normalerweise" eine Schnittstelle verwenden würden, z. B. um eine öffentliche API verfügbar zu machen, oder für Dinge wie "steckbare" Funktionalität. Meine Lösung verfügt über eine kleine Anzahl von Klassen, die für solche Anwendungsfälle geeignet sind. Ich frage mich jedoch, ob alle anderen Schnittstellen unnötig sind und entfernt werden sollten. Verstoße ich in Bezug auf Punkt 3) nicht gegen "lose Kopplung", wenn ich dies tun würde?
Bearbeiten : - Ich habe gerade ein Spiel mit Moq, und es scheint, dass Methoden öffentlich und virtuell sein und einen öffentlichen parameterlosen Konstruktor haben müssen, um sie verspotten zu können. Es sieht also so aus, als ob ich keine internen Klassen haben kann?