Wie vermeide ich doppelte Datenstrukturen, wenn Teile einer App in verschiedenen Sprachen geschrieben sind?

12

Angenommen, Sie schreiben eine App in Java .

Ihre App kommuniziert mit einem in Python geschriebenen API-Server .

Der Python-Server kommuniziert mit einer SQL- Datenbank.

Sie haben auch eine Website für Ihre App in JavaScript geschrieben .

Mit 4 verschiedenen Sprachen ist es einfach, im Wesentlichen die gleichen Datenstrukturen zu 4 verschiedenen Zeiten zu wiederholen.

Ein UserTyp könnte beispielsweise so aussehen (Pseudocode):

type User {
  integer id;
  string name;
  timestamp birthday;
}

Für jeden Teil des Projekts wäre eine Art Vertretung erforderlich User. Die Java- und Python-Teile benötigen zwei verschiedene classDeklarationen. Die Datenbank würde eine UserTabellendeklaration benötigen . Und die Front-End-Site müsste auch eine darstellen User.

Das Wiederholen dieses Typs zu 4 verschiedenen Zeiten verstößt wirklich gegen das Don't-Repeat-Yourself- Prinzip. Es gibt auch das Problem, dass Userdiese Änderungen in jedem Teil des Projekts wiederholt werden müssen , wenn der Typ geändert wird.

Ich weiß, dass die Protobuf- Bibliothek von Google eine Art Lösung für dieses Problem bietet, bei der Sie eine Datenstruktur mit einer speziellen Syntax schreiben und die Bibliothek dann eine Strukturdeklaration für Sie in mehreren verschiedenen Programmiersprachen generiert. Damit ist das Problem der Wiederholung der Validierungslogik für Ihre Typen jedoch noch immer nicht gelöst.

Hat jemand Vorschläge oder Links zu Büchern / Blogposts darüber?

Normangorman
quelle
Dies ist ein Grund, warum viele Leute ihre gesamte Entwicklung auf JavaScript verlagert haben. Funktioniert auf dem Client (Web, Ionic für Mobilgeräte, Electron für Desktop), Server (Node), Datenbank (MongoDB).
Paul
3
Man kann dieselben Datenstrukturen gemeinsam nutzen, wenn das Back- und Front-End dieselbe Sprache verwenden. Sie wiederholen sich nicht, wenn Sie andere Codebasen verwenden. Verwenden Sie Tooling, um die Klassen aus XML-Schemas oder Json-Zeichenfolgen von den verschiedenen Entwicklungsplattformen zu generieren.
Jon Raynor
5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle. Nicht, tut es nicht. Sie haben 4 verschiedene Systeme, die verschiedene Dinge tun. Sie gehen mit DRY zu weit. Nach meiner Erfahrung ist die Art der Wiederverwendbarkeit, die Sie tun möchten, der Keim des Bösen, weil Sie eine enge Kopplung einführen. Das ist noch schlimmer als User4 Mal in 4 verschiedenen Sprachen wiederholt zu haben. In verteilten Umgebungen ist die Kopplung ein Problem. DRY ist nicht.
Laiv
Sie haben keine Zeit für eine Antwort: Je nach Ihren Anforderungen können Sie versuchen, die Validierungsregeln mithilfe von z. B. OWL zu formulieren (erstellen Sie also eine Ontologie). Validierungsregeln werden dann zu "Daten", die an den erforderlichen Stellen verwendet werden können. Das Ändern der Regeln kann dann an einer zentralen Stelle erfolgen.
Daniel Jour

Antworten:

12

Sie____ nicht. Oder wirklich, das solltest du nicht.

Wenn Sie sich App, Ihren Server und Ihre Website als getrennte Kontexte vorstellen, ist es sinnvoll, doppelte Strukturen zu erstellen. Gründe, warum es eine gute Sache sein könnte:

  • Die Strukturen sind ähnlich, aber nicht gleich. Auch wenn 90% der Struktur in allen Kontexten gleich sind. Es sind die 10%, die Ihnen massive Kopfschmerzen bereiten.
  • Muster und Implementierungen können unterschiedlich sein. Wenn verschiedene Sprachen und Frameworks verwendet werden, wird es viel zu schwierig, dieselbe Implementierung auf allen zu haben
  • Die gemeinsam genutzten Strukturen werden zu einer Abhängigkeit, die verwaltet werden muss. Geteilte Abhängigkeit macht die Entwicklung sehr kompliziert, da Veränderungen, die in einem Kontext groß sind, in einem anderen abgrundtief sind. Es sind also viele Anstrengungen erforderlich, um die Entwicklung dieser gemeinsamen Abhängigkeit zu koordinieren
  • Unterschiedliche Kontexte haben unterschiedliche Bereitstellungen. Selbst wenn Sie es schaffen, dieselben Datenstrukturen und denselben Validierungscode in allen Kontexten gemeinsam zu nutzen, kann es dennoch vorkommen, dass eine neue Version eines Kontexts bereitgestellt wird, während sich andere in einer alten Version befinden. Daher müssen in den Versionen Desynchronisierungen durchgeführt werden adressiert sein

Das DRY-Prinzip ist zwar erstaunlich, aber ich denke, dass das Teilen von Datenstrukturen über Kontexte oder Ebenen hinweg mehr Probleme verursacht als löst. Vor allem, wenn das Projekt so groß wird, dass verschiedene Personen an verschiedenen Kontexten arbeiten.

Euphorisch
quelle
5

Ich denke, @Euphoric hat ein paar gute Gründe aufgelistet, Ihren Code nicht zu duplizieren. Wenn Sie dies jedoch tun müssen, würde ich die Verwendung der Codegenerierung empfehlen.

Finden Sie die kanonische Form der Daten

Um dies effektiv zu tun, müssen Sie zunächst die kanonische Form der Daten ermitteln. Handelt es sich um Ihr SQL-Schema oder um Klassen in Ihrem Java-Programm?

Leiten Sie (automatisch) die anderen Formulare daraus ab

Entwickeln Sie anschließend einen Weg, um alle anderen Formen aus der kanonischen zu generieren. Angenommen, Ihre kanonische Form ist das SQL-Schema, dann können Sie auf einfache Weise JavaScript-, Java- und Python-Code generieren (SQL ist einfach zu analysieren und ein guter Kandidat für die kanonische Quelle).

Unterschiede ausgleichen

Es sollte einfach sein, Abschnitte des generierten Codes als "Nicht berühren" zu kennzeichnen. Auf diese Weise können Sie die erforderlichen Unterschiede zwischen den verschiedenen Darstellungen berücksichtigen (z. B. den benutzerdefinierten Code, den Sie für Ihr JS-Frontend und Ihr Java-Backend geschrieben haben) müssen über Regenerationen hinweg erhalten werden.
Nimm ein Beispiel von Git; Wenn ein Editor geöffnet wird, mit dem Sie eine Bestätigungsnachricht eingeben können, enthält die Datei bereits Text. Die # -------- >8 --------Markierung weist jedoch darauf hin, wo Ihr Inhalt endet und wo der automatisch generierte Text beginnt.

Dennoch, wenn Sie können - vermeiden Sie solche Doppelungen. Es ist ein PITA, auch wenn der größte Teil Ihres Codes automatisch generiert wird.


Diese Antwort ist ein bisschen wie eine Story, anstatt "hier sind einige Best Practices" - was ich beschrieben habe, ist genau das, was ich einmal getan habe, als ich das gleiche Problem wie Sie hatte und die gleichen Daten in verschiedenen Teilen des Systems darstellen musste (oder vielmehr in zwei verschiedenen Systemen).

Mael
quelle