Ich verstehe eine Schnittstelle als einen Vertrag, der auf Klassen angewendet werden kann, die sonst nichts gemeinsam haben (zB: vergleichbar in Java). In welchen Situationen hätten Sie jedoch den Reflex, in der Entwurfsphase eine Schnittstelle hinzuzufügen?Anwendungsdesign - Wann sollten Schnittstellen verwendet werden?
Antwort
"Ich verstehe eine Schnittstelle als einen Vertrag, der auf Klassen angewendet werden kann, die sonst nichts gemeinsam haben" - das ist wahrscheinlich nicht die Art, darüber nachzudenken, was eine Schnittstelle ist.
Eine Schnittstelle beschreibt das Verhalten und die Implementierung einer Schnittstelle bedeutet, dass eine Klasse einen Vertrag eingeht, um dieses Verhalten zu liefern.
Indem Sie anstelle einer Implementierung eine Schnittstelle programmieren, aktivieren Sie Polymorphie und erhalten flexibleren Code mit geringerer Kopplung. Zum Beispiel kann dieses Verfahren eine Instanz übernehmen, die IQuack
implementiert:
public void DoSomething(IQuack quacker)
{
// ...
}
Jedes Mal, wenn Sie eine statisch typisierte Sprache verwenden, und Sie wollen es möglich machen, für die Entwickler den Code zu verwenden, während eine alternative Implementierung bereitstellt - in Mit anderen Worten, in einer solchen Sprache ist es notwendig, eine niedrige (er) Kopplung zu erreichen.
Sprachen, die in der Regel anstelle einer strikten Typprüfung wie z. B. python ducktyping verwenden, benötigen normalerweise keine Schnittstellen.
Wenn Sie ein Produkt entwerfen und Sie wissen, dass das Produkt mit einer Art von Gerät, Dienst usw. interagieren wird, aber nicht unbedingt welche, können Sie eine Schnittstelle verwenden, um mit der gesamten Architektur fortzufahren, die Sie kennen Genug über diese Gerätetypen, um eine Schnittstelle zu schreiben, die von einem bestimmten Gerät dieses Typs erfolgreich verwendet werden kann. Natürlich, wenn Sie in der Entwurfsphase sind, haben Sie besser dieses Wissen. Es ist nicht ungewöhnlich, High-Level-Designs nur mit Interface-Deklarationen zu verwenden. Ich sage nicht, dass es gut oder schlecht ist, aber es scheint eine ziemlich übliche Praxis derer zu sein, die Software (wie Rose usw.) benutzen, um ein Skelett von UML zu erzeugen. Eine andere Zeit wäre, wenn Sie genau wissen, welches Gerät Sie verwenden werden, aber Sie denken, dass es eine Chance geben könnte, dass Sie mit verschiedenen oder mehreren Typen dieses Geräts arbeiten müssen.
Eine dritte Verwendung von Schnittstellen besteht darin, doppelten Code zu reduzieren. Dies ist wahrscheinlich der einzige Ort, an dem sich die Leute mit Interfacenutzung hinreißen lassen, und wenn es nicht dafür wäre, würde ich mich wohl sagen, nicht fragen: "Soll das eine Schnittstelle sein?" aber "Kann das eine Schnittstelle sein?".
"Designphase"? Sie scheinen darauf hinzuweisen, dass Softwareentwicklung in einer Reihe von verschiedenen Phasen durchgeführt wird? Sie scheinen auch anzunehmen, dass Sie alles wissen, mit dem ein Produkt im Voraus interagieren wird? – Arafangion
"Entwurfsphase" wie in der Phase, in der die Anforderungen gesammelt werden, auch bekannt als "Anforderungs-/Analysephase". http://infolab.stanford.edu/~burback/watersluice/node2.html – Nick
In Bezug auf alles zu wissen, mit dem ein Produkt im Voraus interagieren wird, bin ich mir nicht sicher, ob ich den Kommentar verstehe. Wenn Sie meinen, ich nehme an, ich kenne alle "Arten" von "Dingen", mit denen ich interagieren werde, ja. Wenn Sie meinen, ich nehme an, ich kenne das genaue Modell/rev/etc. von den "Dingen", dann nein. Dafür sind die Schnittstellen da. Aber du kannst immer noch keine Schnittstelle für ein "Ding" schreiben, ohne ein paar Hausaufgaben zu machen. – Nick
+1 reduzierte Kopplung. Ein Effekt davon ist, dass Komponententests Objekte außerhalb der zu testenden Einheit vortäuschen können. –
Einfachere Komponententests sind nur ein Nebeneffekt der reduzierten Kopplung - es macht den Code einfach viel flexibler. – Arafangion
Richtig - sie sind "ein Effekt davon." –