Объясните в чём заключается циклическая зависимость в паттерне Visitor?Понятно, что если добавляется ещё один элемент в посещаемой иерархии, то у каждого посетителя надо прописать visit() для этого элемента. Здесь видна зависимость.Но если добавляется новый посетитель реализующий интерфейс Visitor, каким образом это влияет на посещаемую иерархию? Ведь весь принцип паттерна в том чтобы она не менялась. Где цикл?
>>148543680 (OP)А с чего ты взял, что она есть?
>>148548164https://web.archive.org/web/20151022084246/http://objectmentor.com/resources/articles/visitor.pdf
>>148549258Может сошлешься на конкретную строку, где цикличность упоминается? Буду я еще после gof эту мочу читать.
>>148550548Начни с acyclic visitor
>>148550548У меня предположение, что при добавлении класса наследующего Visitor, произойдёт перекомпилирование посещамой иерархии, но вот почему произойдёт и каким образом вырожденный (degenerate) класс её предотвращает — я не понимаю.
>>148550592Ну я пробежал глазами. В двух словах, цикл неявно зашит в двойную диспетчеризацию.Ты уже понимаешь, что при добавлении нового типа элементов тебе придется добавить новый визитор под них(ну или визит-метод в визитор), который принимает на вход элементНо в каждом элементе есть accept-метод, с зависимостью на визитор. Представь, что я поменял сигнатуру интерфейса visitor - теперь мне нужно вносить изменения в каждый тип помещаемых элементов.
>>148551704Т. е. не получается безболезненно менять ни только визитор, ни только гостей
>>148551704>Представь, что я поменял сигнатуру интерфейса visitor - теперь мне нужно вносить изменения в каждый тип помещаемых элементов.Так. И если ты уберёшь все методы из Visitor, спустив их на уровень ниже в HayesVisitor, ZoomVisitor, ErnieVisitor, то при изменении сигнатуры (например) HayesVisitor меняется не вся иерархия посещаемых элементов, а только тот класс accept которого кастит на HayesVisitor. Так?
>>148551759Ты избавляешься от цикличной зависимости, заменяя контракт на visit-метод в корне иерархии визиторов локальными контрактами в каждом leaf-визиторе. Посмотри, теперь у тебя вместо единой реализации accept-метода много локальных, т. е. теперь у тебя нет какой-то единой точки отказа, изменения в которой повлекут за собой необходимость менять кучу кода.
>>148552414Понял, спасибо.
>>148552338Да. >>148552414В этом ничего плохого, потому что благодаря иерархии визиторов я гарантирую, что в accept-метод попадает не какой-то мусор, а потомок визитора
>>148552444Я на всякий случай тебе неплохой сайт принес.https://refactoring.guru/ru
>>148552444Трипл же, даже не сомневаюсь, что все понял.
>>148543680 (OP)Образовач
>>148552678Неплохо. Некая выжимка из code complete и GoF, я так понимаю? Погляжу.
>>148553718тут хорошо описаны паттерны, но некоторые другие статьи приведены рандомными кусками