2012-03-30 10 views
2

Es tut mir leid, dass dies die Frage ist, die sich eher auf einen Rat als auf ein Problem bezieht.Verwendung der Schnittstelle ist immer hilfreich?

Ich würde gerne wissen, wann ich eine Schnittstelle verwenden sollte und wann ich nicht sollte.

Um es klar, meine Frage zu machen, werde ich meine aktuelle Implementierung mit und ohne Schnittstelle schreiben:

MIT INTERFACE

interface IObjectBuilder 
{ 
    string Build(); 
} 

class ObjectABuilder: IObjectBuilder 
{ 
    ObjectABuilder(Object A){} 

    public string Build(); 
} 

class ObjectBBuilder: IObjectBuilder 
{ 
    ObjectABuilder(Object B){} 

    public string Build(){} 
} 

ohne Schnittstelle 1:

class ObjectABuilder 
{ 
    ObjectABuilder(Object A){} 

    public string Build(){} 
} 

class ObjectBBuilder 
{ 
    ObjectBBuilder(Object B){} 

    public string Build(){} 
} 

OHNE I Nterface 2:

class ObjectABuilder 
{ 
    public string Build(Object A){} 
} 

class ObjectBBuilder 
{ 

    public string Build(Object B){} 
} 

Also, ich würde gerne wissen, in diesem Fall:

  1. soll ich mit und ohne Schnittstelle und warum?

  2. für den Fall der Verwendung ohne Schnittstelle, was denkst du über den Bau der Klasse mit objectA (b) ist besser oder einfach übergeben Sie es direkt in der Methode?

Vielen Dank im Voraus.

+1

Wenn ich den Klassennamen ObjectABuilder sehe, nehme ich an, dass es ObjectA für mich erstellt. Aber in diesem Fall muss ich das existierende ObjectA an 'builder' übergeben. Und es wird mir eine Saite zurückgeben. Vielleicht ist es ein Serializer? Wie benutzt man diese Bauarbeiter eigentlich? –

+0

Ja, Builder soll ein Objekt in eine Zeichenfolge serialisieren – olidev

Antwort

3

Sie brauchen nicht immer eine interface. Sie werden einen Punkt erreichen, an dem Sie das tun, vielleicht möchten Sie es mit einem anderen Modul teilen, und Sie würden es eher als eine konkrete Implementierung betrachten, dass Sie nur eine Abhängigkeit von einer interface benötigen? Vielleicht möchten Sie die Implementierung einer Schnittstelle für einen Komponententest testen? Ich würde sagen, ohne eine Schnittstelle zu starten, bis Sie zeigen können, dass Sie es brauchen.

Für Ihre zweite Frage, brauchen andere Methoden in der Klasse das Object? Wenn ja, dann würde ich es im Konstruktor übergeben, damit diese Methoden das Object teilen können. Wenn nicht, dann halte ich würde es übergeben.

Das gemeinsame Thema ist zu DTSTTCPW

1

Nicht Schnittstellen ist eine Frage der Wahl. Das Erstellen einer Schnittstelle für die Klasse erstellt im Wesentlichen nur eine "Richtlinie" für das Einführen der Klasse, sodass Sie alle Eigenschaften und Methoden implementieren, die zum Erben von einer abstrakten Klasse erforderlich sind. Für einfachere Klassen ist dieses Problem möglicherweise nicht offensichtlich, aber wenn Sie in sehr komplexe Klassen mit mehreren Ebenen der Verlässlichkeit wechseln, helfen Ihnen Schnittstellen wirklich dabei, Ihre geistige Gesundheit in Schach zu halten.

3

Wie immer gibt es keine Antwort gilt für alle Fälle:

Sie können die Choosing Between Classes and Interfaces von MSDN-Design-Richtlinien für die Entwicklung von Klassenbibliotheken für mehr Einsicht lesen.

Diese Richtlinien sind jedoch auf Klassenbibliotheken ausgerichtet, die Richtlinien können für andere Arten von Projekten mehr oder weniger unterschiedlich sein.(IE: wenn DI Verwendung ist es günstig, Schnittstellen über Klassen zu verwenden)

Schnittstellen verwenden „ist“ eine bewährte Methode, aber alle Überlegungen sollten berücksichtigt, Versionierung, Vererbung genommen werden, vorwärts und rückwärts Kompatibilität usw.

1

Es gibt ein paar Argumente, die ins Spiel kommen.

Wenn Sie auf dem klassischen Buch über Design Patterns schauen sie erklären:

Programm auf eine Schnittstelle, nicht eine Implementierung

Das bedeutet, dass, wenn eine andere Klasse mit nur bei der Suche sollten Sie Schnittstelle und nicht über die Implementierung nachdenken. Zum Beispiel:

weiß, dass ich diese Methode Bla auf Klasse Foo auf Verfahren Boo abhängt, also sollte ich ersten Anruf Boo und dann Bla

Programmierung einer Schnittstelle macht den Code weniger gekoppelt und verbessert testability . In C# haben Sie das explizite Konzept einer Schnittstelle in der Sprache. Dadurch können Sie gute Schnittstellen erstellen und die Implementierung je nach Bedarf austauschen. Wenn es um Tests und Dinge wie Dependency Injection geht, sind Schnittstellen ein Muss. Sie haben aber auch das YAGNI Prinzip (Sie werden es nicht brauchen). Wenn Ihre Software nicht so komplex ist, dann sollten Sie Schnittstellen einführen und Ihren Code (etwas) schwerer entwickeln lassen.

Verwandte Themen