Ist es in Ordnung, Abhängigkeiten innerhalb einer Klasse zu haben, die austauschbar sein soll?

8

Angenommen, ich habe ein Domänenmodell und möchte es von jeder Persistenzschicht lesen und speichern. Im Moment könnte es sich um eine JSON-Datei handeln, in Zukunft könnte es sich jedoch um XML oder eine Datenbank handeln (die sich auch in ihrem Typ ändern könnte ).

Um das Domänenmodell aus der Persistenzschicht zu generieren, habe ich eine Implementierung einer einfachen Schnittstelle, die beispielsweise eine getAll()und- saveAll()Methode enthält. Wenn ich zu einer anderen Art von Persistenz wechseln möchte, kann ich einfach die Implementierung der Schnittstelle ändern. Innerhalb der Implementierung verwende ich jedoch völlig andere Lösungen zum Lesen und Speichern der Daten, sodass ich unterschiedliche Objekte aus anderen Bibliotheken verwenden muss, um mit den Daten umzugehen.

Angenommen, ich verwende in der ersten Implementierung einen Json-Serializer. Anschließend instanziiere ich die Instanz dieses Serializers direkt in meiner Implementierung. Dies führt dann zu meiner Implementierung direkt abhängig von diesem Serializer, ich kann ihm nie wieder einen geben. Dies wäre jedoch sowieso nicht möglich, da es keine universelle Schnittstelle für Serializer gibt (oder welche Art von Persistenz auch immer). Wenn ich also einen anderen Serializer verwenden möchte, kann ich nur eine völlig neue Implementierung schreiben, anstatt nur eine andere von außen zu übergeben.

Ist es in diesem Fall in Ordnung, Abhängigkeiten von hartem Code zu vermeiden? Oder gibt es eine bessere Option?

Philip Feldmann
quelle

Antworten:

4

In Bezug auf meine Antwort auf eine aktuelle Frage besteht der Schlüssel hier darin, die Schnittstellen Ihrer Persistenzschicht mithilfe des Treppenmusters von jeder Implementierung der Persistenzschicht zu trennen.

Die Abhängigkeit vom Json-Serializer wird dann zu einem Implementierungsdetail des Json-Persistenzpakets. Der Rest der Anwendung muss nichts darüber wissen und auch nicht unter der Last dieser Abhängigkeit leiden, da sie nur über die Schnittstellen, die sich in einem anderen Paket befinden, auf das Persistenzpaket zugreift.

Wenn Sie dann ein Datenbankpersistenzpaket hinzufügen, werden diese Schnittstellen einfach implementiert, und die z. B. ORM-Abhängigkeiten werden ebenfalls als Implementierungsdetail ausgeblendet.

David Arno
quelle
2

Sie können nicht alle Abhängigkeiten aus Ihrem Code entfernen. irgendwann musst du dich auf etwas verlassen , sonst wirst du nur mit einem riesigen Gottobjekt enden, das alles selbst macht.

In der Regel möchten Sie, dass jede Klasse von Objekten abhängt, die stabiler sind als sie selbst. und Sie möchten, dass instabile Beziehungen die Abhängigkeitsinjektion verwenden , um einfachere Tests und mehr Flexibilität zu ermöglichen.

Wie wahrscheinlich ist es, dass sich der JSON-Serializer ändert? Ist es mehr oder weniger stabil als der Code, den Sie schreiben?

Wenn es wahrscheinlich ist, dass Sie den Serializer mehrmals durch eine andere Implementierung ersetzen, können Sie möglicherweise einen Proxy oder ein Wrapper-Objekt um den Serializer selbst erstellen. Auf diese Weise können Sie die Schnittstelle steuern, die Sie mit dem Serializer haben, und nur von einer externen Bibliothek an einem Ort abhängig sein.

Ich persönlich habe jedoch noch keinen Grund gefunden, einen JSON-Serializer (durch einen anderen Serializer) zu ersetzen, sodass ich mir keine Sorgen über eine direkte Abhängigkeit davon machen würde. Ein Serializer wird so gut wie immer eine stabilere Oberfläche haben als alles andere in meinen eigenen Anwendungen, und die Methoden, die ich dafür benötige, sind so einfach und wenige, dass es keinen Grund gibt, sie zu ändern.

Es hört sich so an, als wären Sie nicht speziell besorgt darüber, dass sich der Serializer selbst ändert. Von dem, was Sie beschrieben haben, sind Sie besorgt darüber, dass sich externe Anforderungen in ein völlig anderes Persistenzsystem ändern. In diesem Fall wird Ihre Implementierung der Persistenzschicht komplett neu geschrieben Die Verwendung der Abhängigkeitsinjektion oder eines Proxys wird Ihnen sowieso nicht helfen.

Solange die Schnittstelle zwischen Ihrer Persistenzschicht und Ihren Domänenmodellen gleich bleibt und Sie diese Persistenzschicht verspotten, wenn Sie Ihre Domänenmodelle einem Komponententest unterziehen, sehe ich kein Problem damit, von einer bestimmten Schnittstelle einer JSON-Bibliothek abhängig zu sein. Diese Abhängigkeit ist billig zu testen, und es ist unwahrscheinlich, dass sich die JSON-Bibliothek selbst ändert.

Jen
quelle