Par exemple, supposons que vous écrivez une application en Java .
Votre application communique avec un serveur API écrit en Python .
Le serveur Python communique avec une base de données SQL .
Vous avez également un site Web pour votre application écrit en JavaScript .
Avec 4 langues différentes, il est facile de finir par répéter essentiellement les mêmes structures de données 4 fois différentes.
Par exemple, un User
type pourrait ressembler à ceci (pseudocode):
type User {
integer id;
string name;
timestamp birthday;
}
Chaque partie du projet aurait besoin d'une sorte de représentation User
. Les parties Java et Python auraient besoin de deux class
déclarations différentes . La base de données aurait besoin d'une User
déclaration de table. Et le site frontal devrait également représenter un User
.
La répétition de ce type 4 fois différentes rompt vraiment le principe Don't-Repeat-Yourself . De plus, si le User
type est modifié, ces modifications doivent être répétées dans chaque partie du projet.
Je sais que la bibliothèque protobuf de Google offre une sorte de solution à ce problème dans laquelle vous écrivez une structure de données en utilisant une syntaxe spéciale, puis la bibliothèque génère une déclaration de structure pour vous dans plusieurs langages de programmation différents. Mais cela ne résout toujours pas le problème de devoir répéter la logique de validation pour vos types.
Quelqu'un a-t-il des suggestions ou des liens vers des livres / articles de blog à ce sujet?
la source
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle
. Non, ce n'est pas le cas. Vous avez 4 systèmes différents qui font des choses différentes. Vous prenez SEC trop loin. D'après mon expérience, la sorte de réutilisabilité que vous voulez faire est la graine du mal, car introduisez un couplage étroit. C'est encore pire que d'avoir répétéUser
4 fois dans 4 langues différentes. Dans les environnements distribués, le couplage est un problème. DRY ne l'est pas.Réponses:
Vous n'avez pas. Ou vraiment, vous ne devriez pas.
Si vous considérez l'application, votre serveur et votre site Web comme des contextes distincts, il est logique qu'il y ait des structures en double. Raisons pour lesquelles cela pourrait être une bonne chose:
Bien que le principe DRY soit étonnant, je pense que le partage de structures de données entre contextes ou couches crée plus de problèmes qu'il n'en résout. Surtout si le projet devient suffisamment grand pour que différentes personnes travaillent sur des contextes différents.
la source
Je pense que @Euphoric a énuméré quelques bonnes raisons de ne pas dupliquer votre code. Cependant, si vous devez le faire, je vous recommande d'utiliser la génération de code.
Trouver la forme canonique des données
Pour le faire efficacement, vous devez d'abord découvrir quelle est la forme canonique des données. Est-ce votre schéma SQL ou des classes dans votre programme Java?
Dérivez (automatiquement) les autres formulaires
Après cela, imaginez un moyen de générer toutes les autres formes à partir de la forme canonique. Par exemple, en supposant que votre forme canonique est le schéma SQL, vous pouvez générer facilement du code JavaScript, Java et Python (SQL est facilement analysé et un bon candidat pour la source canonique).
Tenir compte des différences
Il devrait être facile de marquer des sections du code généré comme "ne pas toucher" - de cette façon, vous tiendriez compte des différences requises entre toutes les différentes représentations (par exemple: le code personnalisé que vous avez écrit pour votre frontend JS et backend Java) qui doivent être préservés à travers les régénérations.
Prenons un exemple de Git; quand il ouvre un éditeur vous permet d' entrer un message de validation du fichier contient déjà un texte, mais il a le
# -------- >8 --------
marqueur de savoir où vos extrémités de contenu, et où son commence texte généré automatiquement.Pourtant, si vous le pouvez - évitez une telle duplication. Il s'agit d'un PITA, même si la plupart de votre code est généré automatiquement.
Cette réponse est un peu une histoire au lieu d'une "voici quelques meilleures pratiques" - ce que j'ai décrit est exactement ce que j'ai fait une fois quand j'ai eu le même problème que vous et que je devais avoir les mêmes données représentées dans différentes parties du système (ou plutôt dans deux systèmes différents).
la source