Comment éviter la duplication des structures de données lorsque des parties d'une application sont écrites dans différentes langues?

12

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 Usertype 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 classdéclarations différentes . La base de données aurait besoin d'une Userdé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 Usertype 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?

Normangorman
la source
C'est une des raisons pour lesquelles beaucoup de gens ont déplacé tout leur développement vers JavaScript. Fonctionne sur le client (web, ionique pour mobile, électron pour ordinateur), serveur (nœud), base de données (MongoDB).
Paul
3
On peut partager les mêmes structures de données si le back-end et le front-end utilisent le même langage. Vous ne vous répétez pas s'il utilise différentes bases de code. Utilisez des outils pour générer les classes à partir de schémas xml ou de chaînes Json à partir des différentes plates-formes de développement.
Jon Raynor
5
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é User4 fois dans 4 langues différentes. Dans les environnements distribués, le couplage est un problème. DRY ne l'est pas.
Laiv
N'ayez pas le temps de répondre: selon vos besoins, vous pouvez essayer de formuler les règles de validation en utilisant par exemple OWL (donc construisez une ontologie). Les règles de validation deviennent alors des «données» qui peuvent être utilisées aux points nécessaires. La modification des règles peut alors être effectuée à un endroit central.
Daniel Jour

Réponses:

12

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:

  • Les structures sont similaires, mais pas identiques. Même si 90% de la structure est la même dans tous les contextes. Ce sont les 10% qui vous donneront d'énormes maux de tête.
  • Les modèles et les implémentations peuvent être différents. Lorsque différents langages et cadres sont utilisés, il devient beaucoup trop difficile d'avoir la même implémentation sur tous
  • Les structures partagées deviennent une dépendance qui doit être gérée. Le fait d'avoir une dépendance partagée complique grandement le développement, car un changement important dans un contexte est catastrophique dans un autre. Il faut donc beaucoup d'efforts pour coordonner le développement de cette dépendance partagée
  • Différents contextes ont différents déploiements. Même si vous parvenez à partager les mêmes structures de données et le même code de validation dans tous les contextes, il peut toujours arriver que la nouvelle version d'un contexte soit déployée tandis que d'autres sont sur l'ancienne version, donc les situations où il y a désynchronisation dans les versions doivent toujours être adressé

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.

Euphorique
la source
5

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).

Mael
la source