Modèle de visiteur + principe ouvert / fermé
-
05-07-2019 - |
Question
Est-il possible d'appliquer le modèle de visiteur en respectant le Principe d'ouverture / fermeture , mais vous pouvez toujours ajouter de nouvelles classes visitables?
Le principe Open / Closed stipule que "les entités logicielles (classes, modules, fonctions, etc.) doivent être ouvertes pour extension, mais fermées pour modification".
struct ConcreteVisitable1;
struct ConcreteVisitable2;
struct AbstractVisitor
{
virtual void visit(ConcreteVisitable1& concrete1) = 0;
virtual void visit(ConcreteVisitable2& concrete2) = 0;
};
struct AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor) = 0;
};
struct ConcreteVisitable1 : AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor)
{
visitor.visit(*this);
}
};
struct ConcreteVisitable2 : AbstractVisitable
{
virtual void accept(AbstractVisitor& visitor)
{
visitor.visit(*this);
}
};
Vous pouvez implémenter un nombre illimité de classes dérivées de AbstractVisitor: Il est ouvert pour une extension. Vous ne pouvez pas ajouter de nouvelle classe visitable, car les classes dérivées de AbstractVisitor ne seront pas compilées: elles sont fermées pour modification.
L'arborescence de la classe AbstractVisitor respecte le principe Open / Closed. L'arbre de classe AbstractVisitable ne respecte pas le principe Open / Closed, car il ne peut pas être étendu.
Existe-t-il une autre solution que d'étendre AbstractVisitor et AbstractVisitable comme ci-dessous?
struct ConcreteVisitable3;
struct AbstractVisitor2 : AbstractVisitor
{
virtual void visit(ConcreteVisitable3& concrete3) = 0;
};
struct AbstractVisitable2 : AbstractVisitable
{
virtual void accept(AbstractVisitor2& visitor) = 0;
};
struct ConcreteVisitable3 : AbstractVisitable2
{
virtual void accept(AbstractVisitor2& visitor)
{
visitor.visit(*this);
}
};
La solution
En C ++, Visiteur acyclique (pdf) vous ce que vous voulez.
Autres conseils
Vous souhaitez peut-être consulter la recherche sur "le problème d'expression", voir par exemple.
http://lambda-the-ultimate.org/node/2232
Je pense que le problème est essentiellement académique, mais c'est quelque chose qui a été beaucoup étudié. Vous pouvez donc lire un certain nombre de choses sur différentes manières de le mettre en œuvre dans des langages existants ou avec différentes extensions de langage.