Implementieren einer Ebene zum Ausblenden der Komplexität

8

Als Teil der Abhängigkeiten, an denen das Projekt arbeitet, verwenden wir mehrere Kerndienste. Diese Dienste, an denen wir keine großen Änderungen vornehmen können, sind ein großes Durcheinander. Abhängig von der von uns aufgerufenen Methode müssen wir unsere Parameter (und Rückgabewerte) in verschiedene Codierungen, Gebietsschemas und Zeitzonen konvertieren.

Da wir diese Parameter an mehreren Stellen in unserem eigenen Code generieren, führen wir diese Konvertierungen an mehreren Stellen durch. Manchmal, wo wir sie erzeugen, bevor wir sie an unserer Seite weitergeben; einige Male kurz vor dem Aufrufen der Methode im Kerndienst. Das Chaos breitet sich also in unserem Code aus, und ich möchte eine Ebene einführen, um es zu isolieren.

Meine Frage ist, was der beste Ansatz dafür ist. Anfangs dachte ich daran, nur einen Service / eine Methode zu erstellen, die jedem Service / jeder Methode entspricht, die wir verwenden müssen. Diese Methoden führen einfach die Konvertierung durch, delegieren an die Kerndienste und führen die Konvertierung des Rückgabewerts durch. Aber das scheint irgendwie unhandlich.

Dann habe ich überlegt, Anmerkungen zu verwenden, bin mir aber nicht ganz sicher, wie ich sie verwenden soll. Und so wie ich es verstehe, müsste ich im Idealfall die aufgerufene Methode mit Anmerkungen versehen. Zum Beispiel könnte ich die Parameter mit Anmerkungen versehen @converToUtcund die Konvertierung in der Anmerkungsimplementierung durchführen. Ist das richtig? Dies ist natürlich schwierig, da es nicht unser Code ist und der Code, der derzeit diese Methoden verwendet, in anderen Projekten als unserem beschädigt wird.

Was ist der beste Ansatz für diese Situation?

user3748908
quelle
6
Ein gebräuchlicher Begriff hierfür ist die Antikorruptionsschicht, wenn Sie sie nachschlagen möchten.
Esben Skov Pedersen

Antworten:

6

Sie versuchen, das Fassadenmuster zu implementieren . Grundsätzlich möchten Sie dem Kerncode ein einfacheres Gesicht geben. Möglicherweise möchten Sie eine Reihe von Klassen erstellen, die eine 1: 1-Zuordnung für jede Kernklasse bereitstellen, und dann die Fassadenklassen anstelle der Kernklassen verwenden. Wenn es sich bei den Kerndiensten nur um eine Reihe von Methoden in einer großen monolithischen Klasse handelt, können Sie sie nach funktionalen Domänen (z. B. Authentifizierung, Datenzugriff, Geschäftsfunktion usw.) aufteilen und für jede Domäne eine andere Fassade festlegen. Ihre Fassade sollte eine Schnittstelle aufweisen, die für Ihren Code sinnvoll ist, und alle für die Kommunikation mit den Kerndiensten erforderlichen Zuordnungen und Datenkonvertierungen übernehmen.

TMN
quelle
6

Das Problem, mit dem Sie konfrontiert sind, ist ein Beispiel für ein allgemeines Problem, mit dem wir im Software Engineering häufig konfrontiert sind: Formen der Tools, um sie mithilfe von Abstraktions- / Konvertierungsebenen in unsere spezifische Problemdomäne zu bringen .

Sie haben eine Anwendung, die ein Problem löst. Die Entitäten, die es enthält, verwaltet und mit denen es interagiert, sind Entitäten, die zur Domäne des Problems gehören. Sie werden alle in Begriffen ausgedrückt, die zur Lösung des vorliegenden Problems nützlich sind, und sie sind "freundlich", da Sie sich auf die Lösung des Problems konzentrieren können, anstatt Zeit zu verschwenden und Ihren Code mit Konvertierungen zu verschmutzen, die nichts mit dem zu tun haben Problem zur Hand.

Solange Sie den gesamten Code besitzen, ist das alles in Ordnung und gut. Wenn Sie jedoch Tools (Bibliotheken) von Drittanbietern in das Bild aufnehmen, wurden diese Tools höchstwahrscheinlich nicht für die Arbeit in Ihrer Problemdomäne geschrieben. Daher sind Konvertierungen erforderlich, die häufig ablenkend, umständlich und fehleranfällig sind.

Was normalerweise passiert, ist, dass die Unannehmlichkeiten gering sind und wir nur mit den Werkzeugen fertig werden, die uns gegeben werden. Aber wenn die Unannehmlichkeiten so groß sind, dass sie unser tägliches Leben erheblich erschweren oder das Endergebnis fragiler und fehleranfälliger ist, führen wir manchmal Abstraktions- / Konvertierungsebenen zwischen unserem Code und den von uns verwendeten Tools ein .

Diese Abstraktions- / Konvertierungsebenen bieten Dienste für unseren Code, die in Bezug auf unsere Problemdomäne ausgedrückt werden. Sie werden an Tools von Drittanbietern delegiert und führen dabei alle erforderlichen Konvertierungen durch. Dabei abstrahieren diese Ebenen in der Regel auch so weit wie möglich von den Besonderheiten der von uns verwendeten Werkzeuge, sodass wir theoretisch ein Werkzeug durch ein anderes Werkzeug ersetzen können, indem wir nur die Abstraktions- / Konvertierungsebenen mit der Nummer 1 ändern müssen unsere Kernlogik ändern.

In Bezug auf Anmerkungen sehe ich nicht, wie sie hier helfen können. Wenn Sie den Quellcode der Zielschnittstellen nicht besitzen, können Sie ihnen zunächst keine Anmerkungen hinzufügen. Aber selbst wenn Sie den Zielschnittstellen irgendwie Anmerkungen hinzufügen könnten, müssten Sie, damit die Anmerkungen funktionieren, eine Zwischenschicht zwischen Ihrem Code und den Zielschnittstellen einbetten, die die Aufrufe abfängt, die Anmerkungen der Zielmethoden untersucht und die ausführt notwendige Umbauten. Sie könnten vielleicht das Spring Framework oder etwas wie den Interceptor des Castle Proxy verwenden Mechanismus zum magischen Einbetten dieser Zwischenschicht zwischen Ihrem Code und den Bibliotheken, aber es scheint mir, dass Sie die Zwischenschicht genauso einfach auf herkömmliche Weise schreiben können, indem Sie die Zielschnittstellen genau kennen und die Konvertierungen in einem fest codierten Format durchführen , unkomplizierte Art und Weise, und auch die Schnittstellen der Bibliotheken entsprechend Ihren Anforderungen zu abstrahieren.

Mike Nakis
quelle
0

Zunächst müssen Sie (oder Ihr Team) ein "Standard" -Format vereinbaren, das Sie in Ihrem eigenen Code verwenden. Zum Beispiel:

  • Codierung: UTF-8
  • Gebietsschema: en_UK
  • Zeitzone: UTC

Erst danach können Sie eine Ebene schreiben, die die Werte an die von Ihren Abhängigkeiten angeforderten Formate anpasst (ich denke nicht, dass dies unhandlich ist).

Wie Mike Nakis sagte, sehe ich auch keinen Vorteil darin, Anmerkungen zur Lösung dieses Problems zu verwenden.

Gepunktet
quelle