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. Wann sollten Speicherkarten verwendet werden?
- 2. Wann sollten schwache Referenzen verwendet werden?
- 3. Wann sollten JavaScript-Template-Engines verwendet werden?
- 4. Wann sollten Klassen in C# verwendet werden?
- 5. Wann sollten Makrofunktionen in Erlang verwendet werden?
- 6. Wann sollten zusammengesetzte Indizes verwendet werden?
- 7. Wann sollten Pragmas auf SQLite verwendet werden?
- 8. Wann sollten Erweiterungsmethoden vermieden werden?
- 9. Wann sollten 1-zu-1-Beziehungen zwischen Datenbanktabellen verwendet werden?
- 10. Wann sollten BOOL und bool in C++ verwendet werden?
- 11. Wann sollten Singleton-Klassen in Ruby verwendet werden?
- 12. Wann asynchrone Operationen in Asio verwendet werden sollten
- 13. Wann sollten explizite Ausrichtungsrichtlinien in der Assembly verwendet werden?
- 14. Wann sollten <%# ... %> und <%= ... %> verwendet werden?
- 15. Wann sollten `DateTime.now.utc` und` Time.current.utc` in Rails verwendet werden?
- 16. Wann sollten Named Pipes in Windows verwendet werden?
- 17. Wann sollten mehrere Sprite-Batches in XNA verwendet werden?
- 18. Clojure Best Practice: Wann sollten Metadaten verwendet werden?
- 19. Wann sollten Seaside-Komponenten verwendet und wann einfache Renderobjekte verwendet werden?
- 20. Wann sollte FOUNDATION_EXPORT verwendet werden?
- 21. Wann sollten Ganzzahlen explizit angegeben werden?
- 22. Sollten Schnittstellen Eigenschaften definieren?
- 23. Welche Textboxereignisse sollten verwendet werden
- 24. Wann sollten die BDD-Testszenarien geschrieben werden?
- 25. Wann sollten keine benutzerdefinierten Ausnahmen erstellt werden?
- 26. Wann sollten Ereignisse in Silverlight ausgehängt werden?
- 27. Wann sollte ein IOC-Container verwendet werden?
- 28. Wann sollte der Cloud-Server verwendet werden?
- 29. Wann sollte WS_EX_NOREDIRECTIONBITMAP verwendet werden?
- 30. Wann werden assoziative Entitäten verwendet?
+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." –