Ich habe mich gefragt, ob der folgende Code eine schlechte Vorgehensweise zeigt (über die Schnittstellenvererbung):
%Vor%Hier wollte ich zwei Dinge: 1. Verwenden Sie die Verwendungsanweisung von C #, um die Abhängigkeiten meines konkreten Objekts elegant zu verteilen (es ist nicht erforderlich, etwas an IDisposable zu übergeben). 2. Verwenden Sie eine Factory-Methode, um ein konkretes Objekt zu erstellen, damit ich nur mit den Schnittstellen arbeiten kann.
Getrennt, beide sind als gute Praktiken bekannt, aber zusammen? Ich habe nicht gefunden, dass es hier falsch ist Ссылка (MSDN - Interface Design), aber ich denke, es klingt nicht gut ...
Ich würde mich über jeden Kommentar darüber freuen. Wenn es eine schlechte Praxis ist, welche Art von Problemen würde ich mit diesem Ansatz begegnen?
Danke!
In der Wildnis gibt es keine definitiv gute oder schlechte Praxis, jede hat ihre Vor- und Nachteile
Eine Übung wird nur dann gut oder schlecht, wenn sie auf ein konkretes Problem angewendet wird (lies: nicht IFoo
).
Stellen Sie sich also statt der Anleitung in MSDN die folgende Frage:
Löst dies das Problem und macht es den Code einfacher zu lesen?
Wenn die Antwort ja lautet, gehen Sie mit.
Ich persönlich mag den Ansatz. Wenn der Vertrag für IFoo
eine ordnungsgemäße Entsorgung erfordert (think: IGraphicalObject
, IResource
, IConnection
), ist es eine sehr gute Design-Entscheidung, dies explizit zu machen.
Halten Sie sich nicht von Dogmen gefangen: Die Programmierung mit Schnittstellen macht Sie unabhängiger von konkreten Implementierungen, aber die Programmierung only mit Schnittstellen kann ein Albtraum sein. Sei vernünftig, das ist es.
Sie können Google verwenden, um alle Schnittstellen zu finden, die in .NET Framework selbst von IDisposable
erben:
intitle:interface "inherits idisposable" site:msdn.microsoft.com
Wie oben erwähnt, wird dies normalerweise für Entitäten ausgeführt, die bekannt sind um Ressourcen zu verbrauchen, wie z. B. Datenbankverbindungen, nicht verwaltete Objektwrapper, grafische Objekte usw.
Das Implementieren von Dispose()
in eine Klasse, die nichts zu tun hat , wäre eine schlechte Idee.
In diesem Fall ist es besser, es optional zu belassen und nach IDisposable
support zu suchen, wie zum Beispiel vorgeschlagen von Peter .
Das ist absolut gültig. Genau dafür sind Schnittstellen da. Sie definieren Verträge. Ein Vertrag kann unter Verwendung mehrerer Unterverträge erstellt werden.
Ich denke, es ist richtig. Ihr Werk blendet aus, welche Klasse tatsächlich instanziiert wird, damit IFoo
IDisposable
erben muss, damit der Client Dispose()
aufrufen kann. Mit dieser Klasse kann und sollte der Client die tatsächlich instanziierte Klasse überhaupt nicht kennen. Alle relevanten Informationen sollten von der Schnittstelle mitgeführt werden - einschließlich der Notwendigkeit der Entsorgung.
Technisch ist alles in Ordnung mit dieser Lösung.
Aus einer semantischen Sicht könnte man argumentieren, dass die Notwendigkeit von IDisposable
ein Implementierungsdetail ist und nichts mit dem tatsächlichen Vertrag Ihrer Klasse zu tun hat.
Sie können das Objekt in IDisposable
umwandeln und nur Dispose()
aufrufen, wenn es IDisposable
:
Aber in diesem Fall würde ich mit der Schnittstellenvererbung gehen, wie Sie es vorgeschlagen haben. Es ist nicht der sauberste Ansatz, aber macht den Job für Sie perfekt und braucht weniger Code.
Tags und Links c# inheritance design-patterns oop