Re[41]: Есть ли вещи, которые вы прницпиально не понимаете...
От: alex_public  
Дата: 28.12.13 12:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Прямо такой же — не получится. Потому, что в исходном коде подразумевается реактивность. Т.е. ваша задача — не энергичный цикл (который встанет в ожидании следующего события, заморозив нативный поток и отожрав мегабайт address space процесса), а как раз функция OnEvent(Event e){Analyze(e.value);}.

S>Когда вы её напишете, можно будет сравнить объём и понятность кода.

1. Мы в том той ветке дискуссии обсуждали именно парсеры (хотя я бы скорее назвал это некими анализаторами коллекций всё же, ну да ладно), а не реактивность. И код парсера вообще никак не зависит от метода его запуска. Цикл это или же функции обратного вызова — это всё в любом случае относится к коду "генератора данных", а не анализатора.
Т.е. то, что я написал код вида
for(;;){
    Analyze(rand());
    this_thread::sleep_for(chrono::seconds(1));
}

вместо чего-то вроде
auto generator=MakeGenerator(rand, chrono::seconds(1));
generator.Subscribe(Analyzer);
generator.Start();

абсолютно никак не поменяло обсуждаемую функцию Analyzer.

2. Если мы всё же говорим, что основной смысл Rx — это реализация паттерна Наблюдатель для коллекций, а не некие последующие linq-подобные извращения, то тогда у меня к Rx нет ни малейших претензий. Ну разве что кроме того, что обычно подобное проще написать самому, чем подключать стороннюю библиотеку.

S>В простых случаях у вас будет получаться более-менее понятный код. Примерно как в обработчике события MouseClick, который отлавливает Double Click путём сравнения текущего клика с предыдущим. Ну, только надо будет руками декларировать все переменные состояния — скалярные в случае тикера/тренда и стек в случае обработчика листьев дерева. А с монадами и прочими автогенераторами стейт-машина генерируется автоматически компилятором.


Ну так если нам нужен конечный автомат, то для этого есть отличные специализированные инструменты, причём без всяких ужасов типа попытки записать некое подобие БНФ через linq синтаксис. Т.е. для простейших случаев пишем линейный код, а для сложных берём удобный конечный автомат (например boost.statechart). И это всё находится внутри функции Analyzer, которую опять же можно вызывать и внутри цикла и реактивным способом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.