Bonne rentrée, les C++iens !
Je me remets sur mon projet et je suis face à un problème de conception. J'ai hésité à poster dans le forum conception général, mais tout ceci est je trouve assez propre au C++.
Voilà le problème.
Je souhaite modéliser les entités sémantiques du C++ : les namespaces, les classes, les fonctions et tout et tout. Restons-en à ces trois types d'entités.
Je suis partagé entre deux solutions :
- mettre en place un pattern composite transparent (une interface scope que les classes namespace_, class_ et function vont implémenter d'une part et agréger d'autre part), en utilisant le polymorphisme d'inclusion ;
- ou faire une totale distinction entre ces trois classes, en utilisant le polymorphisme paramétrique.
Le problème avec la solution 1, c'est qu'elle n'est pas type-safe. Si j'écris une interface scope contenant une fonction permettant d'ajouter un namespace, cela n'aura pas de sens pour les objets de type class_ et function.
Après, avec un pattern Visitor, on peut toujours s'en sortir.
Le problème avec la solution 2, c'est la nécessité d'émuler le polymorphisme d'inclusion à plusieurs endroits du code (grâce à des outils du style boost::variant), tels que :
- la liste (présente dans chaque objet des trois classes) des nœuds enfants dans l'arborescence des scopes ;
- le type de retour de certaines fonctions (qui peuvent renvoyer un objet d'un des trois types).
Cette nécessité m'apparait comme symptomatique d'un mauvais choix de type de polymorphisme, mais ce n'est rien de plus qu'une sensation.
Chacune des deux solutions ne fait que me pousser vers l'autre. Le choix est tellement cornélien que je préfère me tourner vers ceux d'entre vous qui ont plus d'expérience en conception. Que faites-vous dans ce genre de situation ? (Peut-être une solution 1,5 ?)
Merci à vous !
Partager