Programmierung gegen Schnittstellen: Schreiben Sie Schnittstellen für alle Domain-Klassen?

StackOverflow https://stackoverflow.com/questions/152077

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin damit einverstanden, dass die Programmierung gegen Schnittstellen ist eine gute Praxis. In den meisten Fällen in Java „Schnittstelle“ in diesem Sinne bedeutet die Sprachkonstrukt-Schnittstelle, so dass Sie eine Schnittstelle schreiben und eine Implementierungsklasse und dass Sie verwenden, um die Schnittstelle statt der Implementierungsklasse der meisten Zeit.

Ich frage mich, ob dies für das Schreiben von Domain-Modellen als auch eine gute Praxis ist. So zum Beispiel, wenn Sie einen Domain-Klasse Kunden habe und jeder Kunde eine Liste von Aufträgen haben, würden Sie im Allgemeinen auch Schnittstellen schreiben ICustomer und iOrder. Und auch würde der Kunde eine Liste von IOrders statt Bestellungen? Oder würden Sie Schnittstellen im Domänenmodell verwenden, nur, wenn es wirklich von der Domäne angetrieben wird, z.B. Sie haben mindestens zwei verschiedene Arten von Bestellungen erhalten? Mit anderen Worten würden Sie verwenden Schnittstellen wegen nur der technischen Anforderungen in dem Domain-Modell, oder nur, wenn es wirklich angemessen in Bezug auf die tatsächliche Domain?

War es hilfreich?

Lösung

Schreiben Schnittstellen „nur weil“ erscheint mich als eine Verschwendung von Zeit und Energie, nicht einen Verstoß gegen das KISS-Prinzip zu nennen.

ich schreibe sie, wenn sie in Vertretung gemeinsames Verhaltens verwandter Klassen tatsächlich nützlich sind, nicht nur als Phantasie-Header-Datei.

Andere Tipps

Sie entwerfen Ihr System nicht über. Wenn Sie, dass Sie verschiedene Arten von Aufträgen haben erfahren, und denken, es ist angemessen, eine Schnittstelle für Aufträge zu erklären, als es Refactoring, wenn die Notwendigkeit entsteht. Für Domain-Modelle, ist die Wahrscheinlichkeit hoch, dass die spezifische Oberfläche viel über die gesamte Lebensdauer der Entwicklung zu ändern, so dass es selten sinnvoll, eine Schnittstelle früh zu schreiben.

Schnittstellen ist eine hervorragende Möglichkeit, von Komponenten für die Einheit zu Testzwecken und allgemeines Abhängigkeitsmanagement zu isolieren. Zu sagen, dass ich oft lieber abstrakte Klassen so zumindest ein Teil des gemeinsamen Verhaltens dort eher abgeladen wird ein Teil der Vervielfältigung als zu zwingen, die Schnittstellen zu bringen. Moderne IDEs machen es schnell und einfach Schnittstellen zu erzeugen, so dass sie nicht sind, dass viel Arbeit: -)

Nein, ich nur Schnittstellen auf Domain-Objekte, um sie zu halten lose gekoppelt. Für mich meinen eigenen Code zu entwickeln der Haupthaken mit Schnittstellen ist, dass ich leicht Mocks schaffen kann, wenn Unit Testing tun. Ich sehe nicht den Punkt Domain-Objekte in spöttischen, da sie nicht die gleichen Abhängigkeiten, die eine Dienstschicht oder DAO Schichtklasse haben würde.

Das heißt noch lange nicht weg wegzulaufen von Schnittstellen in Domain Objects. Verwenden Sie gegebenenfalls. Zum Beispiel in letzter Zeit habe ich auf einer Webapp gearbeitet, wo verschiedene Arten von Domain-Objekten entsprechen permalink Seiten, auf die Nutzer Kommentare hinterlassen können. So implementieren jede dieser Domain-Objekte nun die „kommentierbaren“ -Schnittstelle. Alle von dem Kommentar-basierten Code wird dann auf die kommentierbaren Schnittstelle programmiert anstelle der Domain-Objekte.

würde ich empfehlen, schlank und agil bleiben - nichts tun, bis Sie es tun müssen, dann lassen Sie Ihre IDE für Sie die Refactoring tun, wenn Sie es brauchen.

Es ist ziemlich trivial in IDEA / eclipse eine konkrete Klasse in eine Schnittstelle zu drehen, wenn Sie sich entscheiden, Sie brauchen.

Dann Dependency Injection verwenden mit Frühling oder Guice , wenn Sie in die Stellen im Code viele Implementierungen der Schnittstelle zu injizieren Sie verwenden 'neuen'

Eigentlich ist diese Frage ist ein Beispiel für das weit verbreitete Missverständnis über „Programmierung gegen Schnittstellen“.

Sie sehen, diese ist ein sehr gutes Prinzip, aber es funktioniert nicht bedeuten, was viele Leute denken, es bedeutet!

„Programm mit einer Schnittstelle, nicht eine Implementierung“ (aus dem GoF Buch) bedeutet nur, dass, nicht, dass Sie aus dem Weg zu gehen sollten erstellen separate Schnittstellen für alles. Wenn Sie ein ArrayList Objekt haben, erklären Sie dann die Variable / Feld / Parameter / Rückgabetyp als Typ List zu sein. Client-Code wird dann nur mit dem Interface-Typ befassen.

In dem „Effective Java“ Buch von Joshua Bloch, wird das Prinzip deutlicher ausgedrückt, in „Item 52: Siehe Objekte durch ihre Schnittstellen“. Er sagt auch, in fetten Buchstaben:

  

Es ist durchaus angemessen, von einer Klasse auf ein Objekt zu verweisen, anstatt ein   Schnittstelle, wenn keine entsprechende Schnittstelle vorhanden ist.

Für Unit-Tests ist die Situation völlig abhängig von den Fähigkeiten des spöttischen Tool verwendet. Mit meinem eigenen Werkzeug, JMockit , kann ich Unit-Tests genauso gut für Code schreiben, verwendet Schnittstellen und Dependency Injection als für Code, die letzte Klasse verwendet instanziiert aus dem Innern des im Test befindlichen Code.

Also, für mich ist die Antwort: immer Schnittstellen verwenden, die bereits existieren, aber vermeiden, neue zu schaffen, wenn es keinen guten Grund, dies zu tun (und Testbarkeit , von selbst, sollte nicht eins).

Schreiben Schnittstelle, bevor sie wird benötigt (entweder zum Testen oder Architektur) ist ein Overkill.

Darüber hinaus eine Schnittstelle manuell zu schreiben ist eine Verschwendung von Zeit. Sie können ReSharper des Refactoring „Pull Mitglieder“ verwenden, lassen Sie es aus der spezifischen Klasse in einer Angelegenheit von Sekunden neue Schnittstelle zu erstellen. Andere Refactoring-Tools, die mit IDE integrieren sollten auch ähnliche Funktionen haben.

ich nur in der Regel Schnittstellen verwenden, wo es sinnvoll, auf kleinere Projekte macht. Allerdings ist meine letzte Arbeit hat ein großes Projekt, bei dem fast jedem Domain-Objekt eine Schnittstelle hat. Es ist wahrscheinlich übertrieben und es ist auf jeden Fall ärgerlich, aber die Art, wie wir Frühling haben die Prüfung und für Dependency Injection verwenden Art erfordert es.

Wir schreiben meist Web-Anwendungen mit Wicket, Spring und Hibernate und wir verwenden Schnittstellen für Frühling Bohnen, z.B. Dienstleistungen und DAOs. Für diese Klassen, Interfaces machen total Sinn. Aber wir haben auch Schnittstellen verwenden für jede einzelne Domain-Klasse und ich denke, das ist nur viel des Guten ist.

Auch wenn Sie ziemlich sicher sind, es nur ein konkreter Typ eines Modellobjekts sein wird, Schnittstellen macht spöttisch und Testen etwas einfacher (aber in diesen Tagen gibt es Framworks, die Sie generieren Mock Klassen automatisch für Beton, sogar helfen können Java classes- Mockito, JTestR, Frühling, Groovy ...)

Aber ich sogar öfter verwenden Schnittstellen für Dienste, da es noch wichtiger ist, sie während des Tests zu verspotten weg und Programmierung gegen Schnittstellen hilft denken Sie über Sachen wie Kapselung.

Schreiben Schnittstellen für Domain-Klassen können sinnvoll sein, wenn Sie es für Unit-Tests verwenden. Wir verwenden Mock-Objekte in Unit-Tests. Also, wenn Sie eine Schnittstelle für ein Domain-Objekt und Ihr Domain-Objekt selbst ist nicht bereit, aber Ihr Kunde kann seine Nutzung der Schnittstelle mit Hilfe von Mock-Objekten testen.

Intefaces testen auch mehrere Implementierungen Ihrer Schnittstellen für Ihre Domain-Modell. Also, ich glaube nicht, es ist immer viel des Guten ist.

Ich denke, dass der Hauptgrund für die Programmierung gegen Schnittstellen Testbarkeit ist. Daher ist für die Domain-Objekte - nur Stick auf POJOs oder POC # Os :) usw., das heißt, nur von Ihren Klassen halten, damit alle spezifischen Rahmen der Zugabe von differend Build- und Laufzeit Abhängigkeiten zu verhindern, und das ist alles. Erstellen von Schnittstellen für DAOs ist eine gute Idee, aber.

Wir extrahieren Schnittstellen von allem, nur weil es in der Prüfung hilft (spöttisch) und für Sachen wie AOP. Eclipse kann dies automatisch. Refactor-> Schnittstelle extrahieren

Und wenn Sie die Klasse später ändern müssen, können Sie Refactor- verwenden> Pull Up ... die Methoden ziehen Sie auf die Schnittstelle benötigen.

* Ich tue es, weil ich brauche es für Proxies meiner Domain-Objekte zu erstellen.

Das ist eine andere Sache im Auge zu behalten, dass ich in zu, vor allem mit generierten Domäne und DAO-Objekte ausgeführt haben. Viele der Schnittstellen sind einfach zu spezifisch. Sagen viele Domain-Objekte haben eine ID und ein Statusfeld, warum sie nicht über eine gemeinsame Schnittstelle teilen? Dies hat dazu geführt, mir Frustration, ein unnötig flach (Vererbung weist) Domänenmodell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top