Padrão visitante + Abrir Princípio / Closed
-
05-07-2019 - |
Pergunta
É possível implementar o Visitor Pattern respeitando a Open Princípio / Closed , mas ainda ser capaz de adicionar novas classes visitáveis?
O Princípio aberto / fechado afirma que "entidades de software (classes, módulos, funções, etc.) deve ser aberto para a extensão, mas fechado para modificação".
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);
}
};
Você pode implementar qualquer número de classes que deriva AbstractVisitor: Está aberto para extensão. Não é possível adicionar uma nova classe visitable como as classes derivadas de AbstractVisitor não irá compilar:. É fechado para modificação
A árvore de classe AbstractVisitor aspectos OPEN / Princípio fechado. A árvore de classe AbstractVisitable não respeitar o princípio aberto / fechado, já que não pode ser estendida.
Existe alguma outra solução senão para estender a AbstractVisitor e AbstractVisitable como abaixo?
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);
}
};
Solução
Em C ++, Acíclica Visitor (pdf) fica o que você quer.
Outras dicas
Você pode querer verificar para fora a pesquisa sobre "o problema expressão", ver por exemplo.
http://lambda-the-ultimate.org/node/2232
Eu acho que o problema é principalmente acadêmica, mas é algo que tem sido estudado muito, então há um pouco de coisas que você pode ler sobre diferentes maneiras de implementá-lo em línguas existentes ou com várias extensões de linguagem.