Паттерн Посетитель
От: Андрей Корявченко Россия http://blogs.rsdn.org/avk
Дата: 07.12.06 09:43
Оценка: 120 (3)
Статья:
Паттерн Посетитель
Автор(ы): Андрей Корявченко
Дата: 06.12.2006
Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.


Авторы:
Андрей Корявченко

Аннотация:
Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.
AVK Blog
Re: Паттерн Посетитель
От: AK85 Беларусь  
Дата: 08.12.06 09:57
Оценка: 1 (1) +1
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья:

АК>Паттерн Посетитель
Автор(ы): Андрей Корявченко
Дата: 06.12.2006
Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.


АК>Авторы:

АК> Андрей Корявченко

А когда ее можно будет на сайте прочитать?
Re[2]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.12.06 07:58
Оценка:
Здравствуйте, AK85, Вы писали:

AK>А когда ее можно будет на сайте прочитать?


Месяца через 3.
... << RSDN@Home 1.2.0 alpha rev. 646 on Windows XP 5.1.2600.131072>>
AVK Blog
Re: Паттерн Посетитель
От: minorlogic Украина  
Дата: 17.12.06 11:53
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья:

АК>Паттерн Посетитель
Автор(ы): Андрей Корявченко
Дата: 06.12.2006
Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.


АК>Авторы:

АК> Андрей Корявченко

АК>Аннотация:

АК>Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
АК>Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
АК>Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.

Я могу ошибаться но когда этот патерн становился известным — то мотивация использования была совсем другая ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 17.12.06 12:26
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Я могу ошибаться но когда этот патерн становился известным — то мотивация использования была совсем другая ?


Какая? В википедии, к примеру, тоже говорится:

In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure.

... << RSDN@Home 1.2.0 alpha rev. 669 on Windows XP 5.1.2600.131072>>
AVK Blog
Re[2]: Паттерн Посетитель
От: Дм.Григорьев  
Дата: 17.12.06 17:04
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Я могу ошибаться но когда этот патерн становился известным — то мотивация использования была совсем другая ?


Читаем Банду Четырех "Паттерны проектирования". Мотивация та же. Кстати, а зачем нужна эта статья, если в книге все разжевано?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[3]: Паттерн Посетитель
От: IB Австрия http://rsdn.ru
Дата: 18.12.06 09:12
Оценка: +1
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ> Кстати, а зачем нужна эта статья, если в книге все разжевано?

Я бы не сказал, что в книге уж так все подробно разжевано.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[3]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.01.07 11:51
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Кстати, а зачем нужна эта статья, если в книге все разжевано?


Немножко другй взгляд на проблему + подробное разъяснение некоторых деталей + кое что .NET специфичное.
... << RSDN@Home 1.2.0 alpha rev. 669>>
AVK Blog
Re: Паттерн Посетитель
От: DangerRSDN Россия http://danger-world.livejournal.com/
Дата: 07.02.07 07:33
Оценка:
А зачем внутри класса лишний раз дергать функции get_Type1Nodes и get_Type2Nodes:


    public override void Print(TextWriter writer)
    {
      writer.WriteLine(Name + " : Root");
      foreach (Type1Node node in Type1Nodes)
        node.Print(writer);
      foreach (Type2Node node in Type2Nodes)
        node.Print(writer);
    }


По моему лучше внутри класса использовать прямые ссылки на коллекции:

    public override void Print(TextWriter writer)
    {
      writer.WriteLine(Name + " : Root");
      foreach (Type1Node node in _type1Nodes)
        node.Print(writer);
      foreach (Type2Node node in _type2Nodes)
        node.Print(writer);
    }
Re[2]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.02.07 09:28
Оценка: +2
Здравствуйте, DangerRSDN, Вы писали:

DRS>А зачем внутри класса лишний раз дергать функции get_Type1Nodes и get_Type2Nodes:


Нет там в реальности никакого лишнего дерганья — JIT без проблем с такой ситуацией справляется и устраняет лишний вызов. А гибкость кода при прямом обращении к полям снижается — мало ли какую логику понадобится в свойства вставить? Например ленивую инициализацию коллекций.
... << RSDN@Home 1.2.0 alpha rev. 669>>
AVK Blog
Re: Паттерн Посетитель
От: _FRED_ Черногория
Дата: 04.01.08 15:17
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья:

АК>Паттерн Посетитель
Автор(ы): Андрей Корявченко
Дата: 06.12.2006
Очень часто в программах встречаются сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф. Самое очевидное решение — добавить в базовый класс виртуальный метод, который перекрыть в наследниках для выполнения нужного действия и осуществления дальнейшей навигации по дереву.
Однако у этого приема есть серьезный недостаток: в нем структура данных оказывается увязанной с обрабатывающими ее алгоритмами. Если нам понадобится алгоритм, отличный от реализованного, то придется добавлять еще один виртуальный метод. Еще хуже, если классы, составляющие дерево, содержатся в недоступном для модификации коде.
Одним из вариантов решения проблемы высокой связности в данном случае является паттерн Посетитель.


Возник вопрос о целесообразности IContextVisitor<,>, то есть о возможности передачи параметра в метод Visit(…).
Какие есть резумные примеры передачи дополнительно параметра? Не лучше ли его обработку возложить на сам Посетитель?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 04.01.08 15:58
Оценка: 18 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>Возник вопрос о целесообразности IContextVisitor<,>, то есть о возможности передачи параметра в метод Visit(…).

_FR>Какие есть резумные примеры передачи дополнительно параметра?

Когда в процессе обработки нужно состояние.

_FR> Не лучше ли его обработку возложить на сам Посетитель?


В смысле? Хранить состояние в полях посетителя? Не очень хороший дизайн, потому что чреват нарушениями инвариантов. И несовместим с функциональным стилем.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[3]: Паттерн Посетитель
От: _FRED_ Черногория
Дата: 04.01.08 16:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Не очень хороший дизайн, потому что чреват нарушениями инвариантов. И несовместим с функциональным стилем.


Спасибо. Не обратил внимание, что реализация Visit(…) никак на контекст не влияет, а просто передаёт его visitor-у, так же, как и this. В таком разрезе вопрос снят
Help will always be given at Hogwarts to those who ask for it.
Re: Паттерн Посетитель
От: minorlogic Украина  
Дата: 07.01.08 18:49
Оценка:
Перечитываю на ночь статью и Вики.

Тупо не понимаю , почему "сложные структуры, представляющие собой дерево или граф, состоящий из разнотипных узлов. И, конечно же, при этом имеется необходимость обрабатывать этот граф." речь идет о стрктурах данных ?

Двойная диспечеризация, разделение алгоритма обработки от структуры и структура и метод обхода данных это все строго ортогональные вещи, почему например этот патерн декларируется для обхода дерева и не может применяться для обхода списка или массива?


З.Ы. на ночь туплю .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.08 19:10
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>речь идет о стрктурах данных ?


Речь идет о структуре экземпляров классов в памяти.

M>Двойная диспечеризация, разделение алгоритма обработки от структуры и структура и метод обхода данных это все строго ортогональные вещи


Конечно. Поэтому в статье я постарался максимально разделить эти понятия.

M>, почему например этот патерн декларируется для обхода дерева и не может применяться для обхода списка или массива?


Там нигде не написано, что он не может применятся для обхода списка. Просто деревья — наиболее распространенный случай применения.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[3]: Паттерн Посетитель
От: minorlogic Украина  
Дата: 07.01.08 19:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Там нигде не написано, что он не может применятся для обхода списка. Просто деревья — наиболее распространенный случай применения.


Но например для меня очевидно , что обход дерева и операция с элементом дерева это Ортогональные вещи. Как пример разделения моей уверенности может служить архитектура STL , где обход дерева или массива скрыты за итераторами.

В примере на википедии рассматривается только двойная диспечирезация и нет речи об структурах данных. Кстати в примере "VisitorBase" это очевидно обычный итератор по дереву который еще и двойную диспечеризацию прокидывает. Так же сразу очевидны недостатки и ограниченность этого паттерна , в невозможности расширять базовую иерархию классов и поощрение плохой функциональной декомпозиции базового класса (речь идет о том что функциональность не полностью прописанна через интерфейс и приходится кастить тип наверх).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.08 19:38
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Но например для меня очевидно , что обход дерева и операция с элементом дерева это Ортогональные вещи.


Ну да. И что?

M>В примере на википедии рассматривается только двойная диспечирезация и нет речи об структурах данных.


Ну, с википедией это не ко мне.

M> Кстати в примере "VisitorBase" это очевидно обычный итератор по дереву который еще и двойную диспечеризацию прокидывает.


В этом и суть — объединение итератора и посетителя в случае, если итератор этот единственно возможный.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[5]: Паттерн Посетитель
От: minorlogic Украина  
Дата: 07.01.08 20:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, minorlogic, Вы писали:


M>>Но например для меня очевидно , что обход дерева и операция с элементом дерева это Ортогональные вещи.


AVK>Ну да. И что?


В том что я не вижу пользы от Объединения ортогональных вещей , какая польза от объединения зеленого и шершавого ?

M>> Кстати в примере "VisitorBase" это очевидно обычный итератор по дереву который еще и двойную диспечеризацию прокидывает.


AVK>В этом и суть — объединение итератора и посетителя в случае, если итератор этот единственно возможный.


В этом месте я начинаю терять суть патерна , в чем его польза ? Он как бы состоит из 2-х отдельных приемов. Двойная диспечирезация имеет довольно ограниченное применение. В статье нет реального примера где была бы продемонстрированна его полезность и преимущества. На данный момент меня интересует именно это, кажется с технической частю все более не менее понятно.

Спасибо вам за внимание.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[6]: Паттерн Посетитель
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.08 21:21
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>В том что я не вижу пользы от Объединения ортогональных вещей


Ради бога. Это тебя беспокоит? Хочешь поговорить об этом?

AVK>>В этом и суть — объединение итератора и посетителя в случае, если итератор этот единственно возможный.


M>В этом месте я начинаю терять суть патерна , в чем его польза ?


В том, что это самое примитивное решение, позволяющее это сделать. То что есть и другие — никто не спорит.

M>В статье нет реального примера где была бы продемонстрированна его полезность и преимущества.


Статья не о двойной диспетчеризации, а о паттерне Посетитель. И упоминается она там исключительно в контексте одной из возможных реализаций этого паттерна.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[7]: Паттерн Посетитель
От: minorlogic Украина  
Дата: 07.01.08 22:04
Оценка:
Здравствуйте, AndrewVK, Вы писали:


M>>В этом месте я начинаю терять суть патерна , в чем его польза ?


AVK>В том, что это самое примитивное решение, позволяющее это сделать. То что есть и другие — никто не спорит.


что ЭТО ? и какие преимущества дает делая ЭТО ?

M>>В статье нет реального примера где была бы продемонстрированна его полезность и преимущества.


AVK>Статья не о двойной диспетчеризации, а о паттерне Посетитель. И упоминается она там исключительно в контексте одной из возможных реализаций этого паттерна.


Вот и суть патерна от меня ускользает , я попробую еще почитать на тему. Суть двойной диспечирезации вроде как ясна ...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.