Шаблон посетителя + Открытый / Закрытый Принцип
-
05-07-2019 - |
Вопрос
Можно ли реализовать шаблон посетителей с учетом Открытый / закрытый принцип , но все еще сможете добавлять новые посещаемые классы?
Принцип Open / Closed гласит, что «программные объекты (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации».
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);
}
};
Вы можете реализовать любое количество классов, производных от AbstractVisitor: он открыт для расширения. Вы не можете добавить новый доступный класс, так как классы, производные от AbstractVisitor, не будут компилироваться: он закрыт для модификации.
Дерево классов AbstractVisitor соответствует принципу Open / Closed. Дерево классов AbstractVisitable не учитывает принцип Open / Closed, поскольку его нельзя расширить.
Есть ли другое решение, кроме расширения AbstractVisitor и AbstractVisitable, как показано ниже?
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);
}
};
Решение
В C ++ ациклический посетитель (pdf) получает ты что хочешь.
Другие советы
Возможно, вы захотите ознакомиться с исследованием "проблемы выражения", см., например,
.http://lambda-the-ultimate.org/node/2232 р>
Я думаю, что проблема в основном академическая, но это то, что много изучалось, поэтому есть кое-что, что вы можете прочитать о различных способах ее реализации на существующих языках или с различными языковыми расширениями.