Здравствуйте, ., Вы писали:
.>Здравствуйте, RobinHood, Вы писали:
RH>>Более конкретно на счет моей задачи. RH>> 1)У меня есть пользователи -- это тип данных. .>Т.е. тип данных всего один? Визитор интересен в случае если типов много.
Пока один , но могут появится другие типы.
RH>> 2)Мне нужно расчитывать активность пользователей по различным критериям RH>> Расчеты ведутся в для различных временных промежутков: 1минута , 10минут , 30мин , 2часа , 1день ..... .>А что общего в этих расчётах? Что входные данные? Что выходные? .>Короче. Начни с юнит-теста — накидай кусок кода который ты хочешь видеть, как использовать. .>А там посмотрим каким наиболее простым и эффективным способом решить.
Входные данные с самого начала групируем данные 1 минутный time bucket. И расчитываем среднюю.
т.е средее время пользователя на сайте в 13:05= (24+7+50)/3 = 27 , 13:07 = (12+7+41)/3 = 20 , 13:09= (13+40+37)/3 = 30
Выходные данные 13:05 , средняя посешаемость 27 , 13:07 средняя посешаемость 20 , 13:09 средняя посешаемость 30
Ети данные могут быть входными данными для расчета медианы 10 минутного временного промежутка:
медиана для 13:05 до 13:10 = (20,27,30) ==> 27.
Т.е мы пременили для расчета средней в промежутке 1 минута алгоритм подсчета средней , а для 10 минутного промежутка применяли алгоритм расчета медианы.
RH>> Начаньные требования к системе: RH>> Расчет активности пользователя — (различные статистические алгоритмы) зависит от временных промежутков -- Комманды. RH>>Т.е для 1минуты будет алгоритм А , для 2 часов будет алгоритм Б. .>Как нужный алгоритм выбирается?
Я изначально знаю какой алгоритм к какому типу данных и к какому временному промежутку нужно пременить.( параметры для алгоритма , например расчет медианы длимой = 3) будут задаватся из конфигурации.)
RH>> 3) алгоритмов расчета активности для одного и того же временного промежутка может быть несколько: RH>> для промежутка 10минут может пременятся алгоритм А и затем над результатом Алгоритм В. ==> порядок алгоритмов -- команд важен, и также есть случаи что результат одного алгоритма будет входными данными для другого. .>И как этот порядок задаваться должен? Компилятором? Во время запуска приложеня на основе конфигов|бд? Юзер мышкой квадратики щёлкает и соединяет их?
порядок я знаю изначально , он не будет конфигурироваться. Это можно вынести в конфигурацию , но пока это не обязательно.
RH>>Учитывая что система на ранней стадии мне меняют/добавляют условия очень часто: RH>> Например: RH>> 1) поддержка не только активности пользователей , но и статистика урл-ов .>Т.е. второй тип данных? А насколько общий алгоритм для обработки пользователей и урлов?
Пока одни и теже алгоритмы используются для расчетов активности урлов тоже, здесь хотелось бы иметь гибкость -- для пользователей иметь одни алгоритмы а для урлов другие.
RH>> 2) поддержка новых алгоритмов/комманд для расчета. RH>>я ишу способ сделать такую обьектную модель что бы можно было легко расширять / добавлять новые требования. .>TDD. KISS. DRY. YAGNI.
это что означает?
RH>>Конкретно по Visitor паттерну. RH>> 1) У меня на вход приходит тип данных , а в вашем примере вы прогодитесь циклом по всем типам (for(DataVisitor command : commands)), как можно переделать использование что -бы не переберать все типы. .>Циклы тут причём? Суть такая, что если у тебя есть переменная типа DataVisitor (т.е. инстанс любой команды) и DataType (инстанс какого-то типа данных), то вызовется определённый метод.
это я понимаю. Вопрос в том как организовать код: у меня каждый раз на вход приходит один тип данных => врешний цилк ( в твоем коде) не релевантый , и поэтому получается опять
если тип1 то ...
если тип2 то ...
А я хочу от всех этих ветвлений уйти, что посоветуешь? Мап создавать тип данных -- список команд? Или я не догоняю что — то?
RH>> 2) Возможно ли используя Visitor паттерн поддерживать порядок выполнения комманд для данного типа данных и возможно ли организовать (не для всех случаев) , что результат алгоритма/комманды А это будет входные данные для комманды В для одного и того же типа данных. .>Задаёшь список команд как в моём примере.
Так а порядок команд как можно задать? Ткни пожалуйста где это в твоем примере?
.>Насчёт входов-выходов вряд ли. Это скорее всего проще всего сделать тупым кодом, связываемым IoC. Или я не понял что ты хочешь. Показывай пример.
пример наверху привел. если нужно применить один алгоритм расчета на данными и его результат использовать как входные данные для другого алгоритма.
Здравствуйте, RobinHood, Вы писали:
RH>Входные данные:
RH>Активность пользователя:
RH>Алгоритмы: RH> расчет средней. RH> расчет медианы. RH>Временные промежутки: 1минута , 10минут , 30мин , 2часа , 1день
Можно сделать так: преобразовываешь свой тип данных (юзер, урл, етс) в тип "событие во времени", который содержит время, кол-во и т.п. Это будет входными данными для алгоритмов статистики.
Вроде никаких особо паттернов-то не нужно.
RH>Входные данные с самого начала групируем данные 1 минутный time bucket. И расчитываем среднюю.
RH>т.е средее время пользователя на сайте в 13:05= (24+7+50)/3 = 27 , 13:07 = (12+7+41)/3 = 20 , 13:09= (13+40+37)/3 = 30
RH>Выходные данные 13:05 , средняя посешаемость 27 , 13:07 средняя посешаемость 20 , 13:09 средняя посешаемость 30
RH>Ети данные могут быть входными данными для расчета медианы 10 минутного временного промежутка:
RH> медиана для 13:05 до 13:10 = (20,27,30) ==> 27.
Давай лучше код. Примерно я так вижу:
class StatData{int time_staying_on_page; Time time;}
class User{int id; ....}
...
UserStatExtractor extractor = new UserStatExtractor();
StatData data = extractor.extract(user);
assertEquals(24, data.time_staying_on_page);
assertEquals(new Time("13:05:01"), data.time);
// то же самое для извлечения стат данных из типа Url.
List<StatData> statData = ...
MeanAlgo algo = new MeanAlgo();
alg.setSettings(...1 min...);
MeanStatResult result = algo.calc(statData);
assertEquals(27, result.getMeanValue());
Т.е. начни с тест-кейсов в таком духе.
RH>Т.е мы пременили для расчета средней в промежутке 1 минута алгоритм подсчета средней , а для 10 минутного промежутка применяли алгоритм расчета медианы.
Всем этим алгоритмам вовсе не надо знать о типе "пользователь".
RH>порядок я знаю изначально , он не будет конфигурироваться. Это можно вынести в конфигурацию , но пока это не обязательно.
Ну и пиши простой код, вызвал одну функцию, потом другую. Нужны ли тут какие-то супер-паттерны я пока сомневаюсь.
RH>Пока одни и теже алгоритмы используются для расчетов активности урлов тоже, здесь хотелось бы иметь гибкость -- для пользователей иметь одни алгоритмы а для урлов другие.
Как выяснилось твои алгоритмы никак с конкретными типами не связаны.
.>>TDD. KISS. DRY. YAGNI. RH> это что означает?
Мантра. Гугл в помощь.
RH>это я понимаю. Вопрос в том как организовать код: у меня каждый раз на вход приходит один тип данных => врешний цилк ( в твоем коде) не релевантый , и поэтому получается опять RH> если тип1 то ... RH> если тип2 то ... RH>А я хочу от всех этих ветвлений уйти, что посоветуешь? Мап создавать тип данных -- список команд? Или я не догоняю что — то?
Непонятно. Пока у тебя один тип (а в планах два). Ну и сделай 2 ф-ции: StatData convert(User u), StatData convert(Url u).
RH> Так а порядок команд как можно задать? Ткни пожалуйста где это в твоем примере?
В смысле? Список простой.
.>>Насчёт входов-выходов вряд ли. Это скорее всего проще всего сделать тупым кодом, связываемым IoC. Или я не понял что ты хочешь. Показывай пример. RH>пример наверху привел. если нужно применить один алгоритм расчета на данными и его результат использовать как входные данные для другого алгоритма.
Давай лучше код, какой ты хочешь видеть при использовании твоей системы.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
RH>>Пока одни и теже алгоритмы используются для расчетов активности урлов тоже, здесь хотелось бы иметь гибкость -- для пользователей иметь одни алгоритмы а для урлов другие. .>Как выяснилось твои алгоритмы никак с конкретными типами не связаны.
Пока не связаны , алгоритмы связаны с времеными промежутками (и потенциально будут привязаны к типам):
на данный момент имею:
если тф=1мин
делай Алгоритм 1
если тф=10мин
делай Алгоритм 1 , 2
если тф=30мин
делай Алгорим 1,2
если тф=2часа
делай Алгоритм 1
Это для одного типа.
То что я хочу так ето уйти от всех этих ветвлений через обьектную модель.
Здравствуйте, RobinHood, Вы писали:
RH>>>Пока одни и теже алгоритмы используются для расчетов активности урлов тоже, здесь хотелось бы иметь гибкость -- для пользователей иметь одни алгоритмы а для урлов другие. .>>Как выяснилось твои алгоритмы никак с конкретными типами не связаны. RH>Пока не связаны , алгоритмы связаны с времеными промежутками (и потенциально будут привязаны к типам): RH> на данный момент имею: RH> если тф=1мин RH> делай Алгоритм 1 RH> если тф=10мин RH> делай Алгоритм 1 , 2 RH> если тф=30мин RH> делай Алгорим 1,2 RH> если тф=2часа RH> делай Алгоритм 1 RH>Это для одного типа. RH> То что я хочу так ето уйти от всех этих ветвлений через обьектную модель.
Код давай, юзкейс-сценарий. Конкретика нужна.
Если у тебя 4 интервала и они фиксированы, просто 4 инстанса. Фабрику можно прикрутить.
Интерфейс "Алгоритм" можно сделать?
Можно сделать "Композитный алгоритм"?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: подскажите подходяший шаблон.
От:
Аноним
Дата:
11.09.13 23:09
Оценка:
Chain of Responsibility (цепочка обязанностей) с небольшой модификацией,
каждая команда должна вызывать следующую команду даже если она ее обработала, если она не последняя в цепочке
если нужен различный порядок обработки данных командами тогда мап по типу данных с наборами цепочек
и IoC для конфигурации цепочек
Вот рабочий код (java + spring 3) удовлетворяющий выше-перечисленным требованиям загрузить
результат работы (консоль)
=== test DataType1
Command1 process DataType1
=== test DataType2
Command1 process DataType2
Command2 process DataType2
=== test DataType3
Command1 process DataType3
Command3 process DataType3
соответствие между типами данных наборами команд обработки настраиваются в файле конфигурации spring-config.xml без необходимости пере-компиляции кода.
при необходимости можно сделать расширение функциональности добавлением новых библиотек с типами данных и командами.
вопрос в образовательных целях, какие шаблоны в нем использованы?