Правильный объектно-ориентированный дизайн для наблюдения / регистрации событий метода - PullRequest
0 голосов
/ 24 ноября 2011

Вопрос в общих чертах:

У меня есть объект с методом, который выполняет длинный итеративный процесс, и у меня есть второй объект, который предназначен для регистрации / мониторинга событий в этом длинном итеративном процессе. Каков наилучший дизайн / шаблон проектирования для наблюдения и мониторинга хода итеративного процесса?

Конкретная проблема, над которой я работаю:

У меня есть RandomWalker объект с методом InitiateRandomWalk(), который заставляет случайного бродягу проходить тысячи шагов. У меня также есть объект HeatMaps, который описывает набор изображений тепловых карт, которые отображаются путем анализа каждого шага случайно пройденного пути.

Я не хочу ждать до завершения метода InitiateRandomWalk(), чтобы передать данные пути к объекту Heatmaps и начать рендеринг тепловой карты. Вместо этого я хочу, чтобы мой Heatmaps объект наблюдал и регистрировал данные случайного блуждания, как это происходит.

Некоторые возможности:

  • Я мог бы сделать метод регистрации тепловой карты public и static и вызвать этот метод из InitiateRandomWalk() метода, но это было бы плохим дизайном.
  • Я мог бы, чтобы InitiateRandomWalk () возвращал IEnumerable и yield return каждый шаг, а затем передавал каждый шаг на Heatmaps.
  • Я мог бы передать объект Heatmaps методу InitiateRandomWalk() в качестве параметра.

Какой дизайн / шаблон дизайна будет лучше?

Ответы [ 4 ]

2 голосов
/ 24 ноября 2011

Исходя из конструкции ключевого слова yield return, я предполагаю, что вы используете C #.Использование этой конструкции с Reactive Framework - ИДЕАЛЬНЫЙ (хотя и несколько продвинутый) подход к решению вашей проблемы. Вот хороший обзор того, как использовать его в действии.

Другой вариант - просто объявить событие StepTaken на RandomWalker.HeatMap будет подписываться на событие, а InitiateRandomWalk будет запускать событие каждый раз, когда генерируется шаг.

1 голос
/ 24 ноября 2011

Reactive Extensions был специально разработан для этого сценария:

http://msdn.microsoft.com/en-us/data/gg577609

Другой вариант - просто добавить событие в RandomWalker.

0 голосов
/ 24 ноября 2011

Определенно, код RandomWalk не должен ничего знать о HeatMaps, так как это только один произвольный способ просмотра выходных данных.Я бы выбрал вариант 2 или другую очень слабую связь, например, RandomWalk записывает в файл, а представление HeatMap читает файл.Вы в основном делаете модель Model View Controller, но, возможно, без Controller

0 голосов
/ 24 ноября 2011

Очевидным шаблоном разработки для этого является Observer.

Статья в Википедии по шаблону довольно полная. Здесь - это статья, которая объясняет это с помощью некоторых примеров кода на C #.

В этом случае шаблон может быть излишним, но у вас не будет двух классов, и вы сможете легко добавлять различные методы.для обработки результатов случайного блуждания.

По сути, ваш HeatMap действует как наблюдатель субъекта случайного блуждания.По сути, это сводится к третьему варианту передачи HeatMap в случайное блуждание.

Наиболее мудрый способ реализации - сделать так, чтобы класс HeatMap сам регистрировался (возможно, передавая делегат Func или просто используя события).) с классом случайных прогулок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...