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 User
Typ 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 class
Deklarationen. Die Datenbank würde eine User
Tabellendeklaration 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 User
diese Ä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?
quelle
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 alsUser
4 Mal in 4 verschiedenen Sprachen wiederholt zu haben. In verteilten Umgebungen ist die Kopplung ein Problem. DRY ist nicht.Antworten:
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:
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.
quelle
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).
quelle