Ist die Schnittstellenvererbung eine schlechte Praxis?

8

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!

    
Fabio 09.08.2011, 14:20
quelle

4 Antworten

16

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 ).

%Vor%

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.

Aktualisieren

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 .

    
Dan Abramov 09.08.2011, 14:25
quelle
10

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.

    
Daniel Hilgarth 09.08.2011 14:24
quelle
3

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.

    
Anders Abel 09.08.2011 14:23
quelle
2

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 :

implementiert %Vor%

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.

    
Peter 09.08.2011 14:30
quelle