Я изучал шаблоны проектирования и наткнулся на Шаблон посетителя. Это действительно странная вещь для меня; кажется, что его единственная цель состоит в том, чтобы предотвратить необходимость изменения исходных классов в иерархии, даже если к ним добавлена новая ответственность. Это происходит просто путем делегирования этих обязанностей реализации абстрактного класса (или интерфейса) посетителя и эффективной двойной диспетчеризации для вызова рабочей функции правильного посетителя, передающего правильный динамический тип.
Я изучал различные другие вопросы, обсуждающие, когда и зачем использовать шаблон посетителя, и все, с чем я столкнулся, это то, что в ООП ожидается, что число ваших классов будет расти, а не количество методов в классе. , на котором специализируется Шаблон посетителя.
Однако это правда? Это звучит как грубое упрощение ООП для меня. Для справки, этот ответ пришел от здесь
Я также прочитал еще один (слабо) связанный вопрос здесь, , ответы на которые подразумевают, что вы должны создавать больше классов и разделять обязанности только там, где это имеет смысл. Действительно ли имеет смысл организовать ваш код таким образом, чтобы «ответственность» класса определялась просто одной операцией, независимо от того, над каким типом он работает (т. Е. Посетитель отвечает за реализацию операции для каждого соответствующего типа) Или же гораздо разумнее определить ответственность как набор операций, которые могут быть выполнены для одного типа (делегировать эти обязанности самим типам)?
Если цель состоит в том, чтобы просто сократить количество строк кода в каждом классе, почему это законная цель? Количество строк само по себе не имеет прямого отношения к инкапсуляции, модульности, организации кода или общим хорошим методам ООП, верно?
Edit:
Теперь я понимаю, что шаблоны не существуют для обслуживания ООП, и теперь я понимаю, что в некоторых случаях шаблон Visitor является лучшим решением. При этом, способствует ли это или не способствует менее разумной иерархии классов при использовании вместе с ООП?