Ich lese gerade Agile Prinzipien, Muster und Praktiken in C# von R. Martin und M. Martin und sie schlagen in ihrem Buch vor, alle Ihre Schnittstellen in einem separaten Projekt, z. Schnittstellen.Organisieren von Interfaces
Als Beispiel, wenn ich ein Gui Projekt haben, dass alle meine Klassen benutzerdefinierte Gui enthält, werde ich ihre Schnittstellen in den Schnittstellen Projekt halten. Insbesondere hatte ich eine CustomButton-Klasse in Gui, würde ich die ICustomButton-Schnittstelle in Schnittstellen halten.
Der Vorteil ist, dass jede Klasse, die ein ICustomButton braucht keinen Hinweis auf Gui brauchen selbst, sondern nur auf die viel leichtere Gewicht Schnittstellen Projekt.
Auch sollte eine Klasse in der Gui Projekt ändern und somit Ursache es, wieder aufgebaut werden nur die Projekte, die direkt auf die Custombutton Bezug Neuübersetzung müssten, während die, die auf die ICustomButton Bezug kann unberührt bleiben.
verstehe ich dieses Konzept, sondern sehen ein Problem:
Lets sagen, ich habe diese Schnittstelle:
public interface ICustomButton
{
void Animate(AnimatorStrategy strategy);
}
Wie Sie sehen können, es zu AnimatorStrategy bezieht, die eine konkrete Klasse ist und deshalb würde in einem anderen Projekt sitzen, können wir es Animation nennen. Nun muss sich das Schnittstellenprojekt auf Animation beziehen. Wenn dagegen Animation eine Schnittstelle verwendet, die in Schnittstellen definiert ist, muss darauf Bezug genommen werden.
Zyklische Abhängigkeit - "Hier kommen wir".
Die einzige Lösung für dieses Problem, die ich sehe, ist, dass alle in den Schnittstellen definierten Methoden Eingänge nehmen, die selbst Schnittstellen sind. Der Versuch, dies zu implementieren, wird höchstwahrscheinlich einen Domino-Effekt haben und schnell eine Schnittstelle erfordern, die selbst für die grundlegendsten Klassen implementiert wird.
Ich weiß nicht, ob ich mit diesem Aufwand in der Entwicklung umgehen möchte.
Irgendwelche Vorschläge?
Danke für Ihre Antwort. Ich habe versucht, den DIP (Dependency Inversion Principle) zu verstehen. Während es in der Theorie nett aussieht (niedrigere Klassen sind abhängig von höheren Klassen und nicht umgekehrt), ist es in der Praxis schwer zu implementieren und zu pflegen. Es ist so viel einfacher, Schnittstellen einfach mit den Klassen zusammen zu halten, die sie implementieren. Ich denke, in diesem Fall stimme ich deinem Vorschlag zu, den Entwurf nur dann auf diese Weise zu "komplizieren", wenn es notwendig wird. –