problème instanciation POO
Bonjour !
Si le problème a déjà été posé, je m'en excuse par avance. J'ai beau chercher, je ne trouve pas ou alors c'est que j'ai mal compris les solutions proposées.
Pour commencer, j'ai plusieurs fichiers XML à parser. Dans l'un de ses fichier j'ai une balise de ce type:
Code:
1 2 3 4 5 6 7 8 9
|
<step>
<actions>
<action type="..." .../>
<....../>
</action>
....
</actions>
</step> |
au niveau de mon programme, pour pouvoir le rendre modulable, j'ai une classe mère Action et des sous-classes qui dépendent du type d'action (exemple: action d'envoyer, etc..)
La classe Step possède donc, au vu du fichier XML, une liste d'actions qui n'ont pas forcément le même type.
je récupère la liste des actions et ensuite pour chaque action je suis obligé de vérifier l'attribut "type" pour pouvoir instancier la bonne sous classe:
Code:
1 2 3 4
| for action in element.actions:
if action.type == "send":
self.l_actions.append(SendAction(action))
.... |
Ma question est la suivante:
est ce qu'il existe une manière beaucoup plus élégante de le faire ? Selon le type d'action, instancier avec la bonne sous-classe ? j'ai beau regarder certain pattern, les decorator... soit je ne comprends pas bien ces solutions, soit elles ne me sont pas adaptées. (La première remarque est sûrement la bonne puisque j'utilise python depuis 8 mois et que je ne connais pas encore toutes les subtilités de ce langage.
Merci !
factory et abstract factory = plural
Citation:
Envoyé par
Trankille
est ce qu'il existe une manière beaucoup plus élégante de le faire ? Selon le type d'action, instancier avec la bonne sous-classe ? j'ai beau regarder certain pattern, les decorator... soit je ne comprends pas bien ces solutions, soit elles ne me sont pas adaptées. (La première remarque est sûrement la bonne puisque j'utilise python depuis 8 mois et que je ne connais pas encore toutes les subtilités de ce langage.
Fabriquer l'instance d'une sous-classe en fonction d'un type relève des patterns "factories" qui ne sont spécifiques à Python.
Plutôt qu'écrire:
Code:
1 2 3
| if action.type == "send":
self.l_actions.append(SendAction(action))
elif ... |
vous écrirez:
Code:
self.l_actions.append(factory(action))
Ce code sera plus simple: l'étape de création des actions lues dans fichier .XML sera plus "compacte" puisque le "bruit" de la mécanique de sélection de la s/classe à instancier aura été déplacé "ailleurs".
C'est intéressant "en général" puisque cette séparation vous permet de gérer indépendamment les deux parties - vous pourrez ajouter une s/classe "ailleurs" sans modifier "ce code".
Est ce que la complexité globale de votre code sera réduite en "compliquant" cette étape (plus d'objets => plus de relations, plus d'interfaces...)?
- W