1 pièce(s) jointe(s)
Architecture: Isolation ou transitivité des dépendances
Bonjour,
Je réalise une application C++ dans laquelle j’expérimente quelques concepts et bonnes pratiques d'architecture. L'application permet d'afficher des objets 3D et de les manipuler au travers de divers GUIs. J'ai découpé mon application en trois gros packages que je souhaite les plus indépendants les uns des autres, notamment au niveau des dépendances. Voici un schéma présentant mon découpage:
Pièce jointe 464326
On retrouve d'un coté un package de rendu 3D qui tire sur OpenGL et GLM (lib de mathématiques pour la 3D), et de l'autre un package qui fournit divers classes permettant d'organiser simplement la GUI, tirant sur la bibliothèque de fenêtrage GLFW et la bibliothèque de GUI Dear IMGUI.
L'application utilise donc ces deux packages. Le package applicatif définit les divers éléments de la GUI et la logique applicative. Je développe ça tout seul mais je fais comme si ces packages étaient développés par des équipes différentes, avec les contraintes et la rigueur que cela apporte.
Ma réflexion porte sur la localité des dépendances. Est-ce que chaque dépendances (les classes et fonctions qu'elles fournissent) sont purement locales aux packages et ne devraient pas être utilisé en dehors, ou si on considère que les dépendances sont héritées par le package applicatif. Évidemment, j'ai tout de suite tendance à penser que le choix des dépendances fait partie de l'implémentation de ces packages et que donc cela ne regarde que le package en question, d'autant que cela permet à un package donné de changer son implémentation, et même de libs, tant qu'il remplit son contrat vis à vis des autres packages.
J'ai cependant deux exemples qui me pose des difficultés.
Le premier: le package GUI Helpers tire sur la lib de GUI Dear IMGUI. En gros j'ai créer des factories qui permettent à l'application de créer facilement des fenêtres et des widgets. Cependant, le package applicatif doit définir le contenu de ces widgets, et donc doit utiliser directement la lib Dear IMGUI (pour créer un bouton, des labels, des zones d'édtions, etc). Doit on considérer que les deux packages (Application et GUI Helpers), dépendent chacun de leur côté de Dear IMGUI (comme je l'ai représenté sur le schéma), ou que le package Application dépend de Dear IMGUI par transitivité?
Le second: Dans le package 3D Rendering, j'utilise des types de données fournit par la lib mathématiques GLM, par exemple glm::vec3 qui est un vecteur 3D, pour représenter la position d'un objet. Dans ma GUI je souhaite que l'utilisateur puisse définir la position d'un objet. J'ai donc un panel avec trois valeur éditables (X, Y et Z). Jusque là j'utilise le type glm::vec3 au sein même de l'application, et je map bêtement les valeurs éditables aux composantes X, Y et Z d'un glm::vec3. Quand une valeur est modifiée, je passe ce vecteur au package Rendering via la méthode adéquate pour mettre à jour la position de l'objet. Problème, si dans le package Rendering je décide de passer à une autre lib mathématique, l'application sera cassée et devra être en partie réécrite. Vaut il mieux selon vous, dans la partie applicative, utiliser des types de données génériques (trois float, un tableau de float, ...) que le package Rendering sera chargé de convertir dans le bon type de donnée utilisé en interne?
Je vous remercie pour votre aide dans ma réflexion.