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);
   }
};
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top