Bonjour,
je suis sur un problème de conception sur lequel j'hésite un peu.
J'ai besoin de concevoir un modèle permettant une extensibilité totale.
Par exemple :
j'ai deux pommes, une granny smith et une golden.
j'ai deux instruments : l'un qui découpe en rondelles et l'autre qui pèle les pommes.
Seulement la découpe en rondelle ne fonctionne que sur les granny smith et le pelage que sur les golden.
Comment modéliser cela ?
Et si un jour je veux ajouter une nouvelle pomme et/ou un nouvel instrument, comment modéliser de manière à réduire au maximum l'impact sur l'existant (le réduire à zéro si possible) ?
Basiquement je peux utiliser l'héritage :
- une Granny est une Pomme, mais seules les granny ont une méthode
decouperEnRondelles(),
- une Golden est une Pomme, mais seules les golden ont une méthode peler(),
Si on va plus loin on peut décider que les instruments seront modélisés comme des interfaces :
- une Granny implémente l'interface iPeutEtreDecoupeeEnRondelles,
- une Golden implémente l'interface iPeutEtrePelee.
Mais si je veux rajouter une opération, je serais obligé de modifier les classes en conséquence pour ajouter une implémentation d'interface. Ce n'est donc pas une bonne solution.
Je peux peut-être utiliser le DP "Strategie", mais ce DP evoque une seule strategie. Si je veux pouvoir doter mes Pommes de plusieurs opérations, il faut que je trouve un moyen de l'en doter effectivement mais aussi de "choisir" l'opération à effectuer :
- je peux peut-être "ajouter" des stratégies à ma Pomme en associant chaque stratégie à une clé facilement identifiable comme "PELER" et utiliser simplement une méthode execute(eStrategie) ; rajouter une opération passerait par la modification de l'énumération et la création d'une classe stratégie.
Mais là aussi je me pose une question : ne serait-il pas plus simple de passer par un fichier (XML?) de définition des relations entre les opération et les pommes.
Il faudrait alors que les les opérations sachent décider si elles peuvent être utilisées sur telle ou telle pomme, via la lecture du fichier. Toutes les manipulations de Pomme devront alors passer par une série de méthodes "génériques" permettant de manipuler les attributs de la pomme (getProperty/setProperty).
N'est-ce pas un peu compliqué ? Y a-t-il plus simple (genre réflexivité) ?
Partager