Russian Qt Forum

Программирование => Алгоритмы => Тема начата: r2d2u2 от Апрель 28, 2011, 08:47



Название: Какой паттерн проектирования выбрать.
Отправлено: r2d2u2 от Апрель 28, 2011, 08:47
Народ может кто нибудь подскажет паттерн для организации следующей вычислительной последовательности?

Есть изначальный объект с "сырыми" данными. Необходимо создать цепочку обработчиков этих сырых данных. У каждого обработчика может быть свой алгоритм обработки. Обработчики выстраиваются в "цепочки" так, что результат предыдущего обработчика может подаваться на вход следующему. Алгоритм обработки в обработчиках может настраиваться соответствующими ему по смыслу параметрами.
 Спасибо!


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: Igors от Апрель 28, 2011, 09:06
Есть изначальный объект с "сырыми" данными. Необходимо создать цепочку обработчиков этих сырых данных. У каждого обработчика может быть свой алгоритм обработки. Обработчики выстраиваются в "цепочки" так, что результат предыдущего обработчика может подаваться на вход следующему. Алгоритм обработки в обработчиках может настраиваться соответствующими ему по смыслу параметрами.
Судя по этому (очень общему) описанию, не видно зачем Вам изыскивать какой-то специальный паттерн. Нужно позаботиться о хорошей "модульности", так чтобы расчеты не зависели друг от друга, выделить общие утилиты и.т.п.


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: r2d2u2 от Апрель 28, 2011, 09:26
Судя по этому (очень общему) описанию, не видно зачем Вам изыскивать какой-то специальный паттерн. Нужно позаботиться о хорошей "модульности", так чтобы расчеты не зависели друг от друга, выделить общие утилиты и.т.п.

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


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: asvil от Апрель 28, 2011, 09:30
filter, map, reduce


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: kuzulis от Апрель 28, 2011, 09:42
state machine


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: r2d2u2 от Апрель 28, 2011, 09:50
Да, кстати, по структуре похоже на state machine.
Насчет filter, map, reduce, поищу в нете что и как.   


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: Igors от Апрель 28, 2011, 09:55
Когда-то делал задачу для кардиологии, и возникала проблема "многообразности" выбора. Напр пользователь хочет отобразить график сигнала. Или график + спектр. Перед этим он хочет применить к нему фильтры - эти или те. Словом число вариантов что могут понадобиться как-то не умещается в UI  :)

Я решал это через создание своего мини-интерпретатора. Пользователь задает набор команд, например так
Код:
Signal1 = ReadSignal("file 1");
Window1 = CreateWindow("title", 200, 200);
DrawSignal(Window1, Signal1);
Signal2 = Filter(Signal1, FLT_FOURIER);
DrawSignal(Window1, Signal2);
Смысл в том что пользователь может строить произвольные "цепочки"


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: r2d2u2 от Апрель 28, 2011, 10:28
Я решал это через создание своего мини-интерпретатора. Пользователь задает набор команд, например так
Код:
Signal1 = ReadSignal("file 1");
Window1 = CreateWindow("title", 200, 200);
DrawSignal(Window1, Signal1);
Signal2 = Filter(Signal1, FLT_FOURIER);
DrawSignal(Window1, Signal2);
Смысл в том что пользователь может строить произвольные "цепочки"

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


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: _govorilka от Апрель 28, 2011, 10:52
Почитай описание вот этого проекта:
http://www.mevislab.de/home/about-mevislab/ (http://www.mevislab.de/home/about-mevislab/)

Возможно это подкинет тебе новые идеи.

Подобные графы сейчас используются в основном для обработки изображений и видео (MS DirectShow, GStreamer), но подобные штуки можно использовать для обработки любых массивов данных, например, для визуализации SQL запросов. Можно сделать интересный проект.



Название: Re: Какой паттерн проектирования выбрать.
Отправлено: r2d2u2 от Апрель 28, 2011, 11:12
Почитай описание вот этого проекта:
http://www.mevislab.de/home/about-mevislab/ (http://www.mevislab.de/home/about-mevislab/)
Возможно это подкинет тебе новые идеи.

Спасибо, посмотрю.


Название: Re: Какой паттерн проектирования выбрать.
Отправлено: grin от Ноябрь 11, 2011, 02:50
может это http://codelab.ru/p/chain_of_responsibility/