Есть задачка.
Необходимо написать конфигуратор. Если на первом шаге выбрано это, то на втором доступны только эти, либо эти опции.
Что то типа "Гуру" на market.yandex.ru . Количество шагов для выбора у меня планируется >10 с кучей условий на каждом шаге.
Естественно до меня уже эта тема хорошо проработана. Только вот каково название таких систем?
Вопрос как они называются на английском? И есть ли какие нибудь свободные движки или библиотеки для таких проектов?
Здравствуйте, bizon_art, Вы писали:
_>Есть задачка. _>Необходимо написать конфигуратор. Если на первом шаге выбрано это, то на втором доступны только эти, либо эти опции. _>Что то типа "Гуру" на market.yandex.ru . Количество шагов для выбора у меня планируется >10 с кучей условий на каждом шаге. _>Естественно до меня уже эта тема хорошо проработана. Только вот каково название таких систем? _>Вопрос как они называются на английском? И есть ли какие нибудь свободные движки или библиотеки для таких проектов?
Конечные автоматы.
State-machine или как-то так.
Движки есть, язык программирования какой ?
Здравствуйте, okman, Вы писали:
_>>Вопрос как они называются на английском? И есть ли какие нибудь свободные движки или библиотеки для таких проектов?
O>Конечные автоматы. O>State-machine или как-то так.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, okman, Вы писали:
_>>>Вопрос как они называются на английском? И есть ли какие нибудь свободные движки или библиотеки для таких проектов?
O>>Конечные автоматы. O>>State-machine или как-то так.
L>И что тут будет являться состоянием?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, okman, Вы писали:
O>>>>State-machine или как-то так.
L>>>И что тут будет являться состоянием?
O>>Конфигурация.
L>Конфигурация — это совокупность всех опций или что-то дугое?
Здравствуйте, bizon_art, Вы писали:
_>Есть задачка. _>Необходимо написать конфигуратор. Если на первом шаге выбрано это, то на втором доступны только эти, либо эти опции. _>Что то типа "Гуру" на market.yandex.ru . Количество шагов для выбора у меня планируется >10 с кучей условий на каждом шаге. _>Естественно до меня уже эта тема хорошо проработана. Только вот каково название таких систем? _>Вопрос как они называются на английском? И есть ли какие нибудь свободные движки или библиотеки для таких проектов?
Экспертные системы. Причем предлагают варианты сначала более вероятные. Требуют обучения
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, okman, Вы писали:
O>>>>>State-machine или как-то так.
L>>>>И что тут будет являться состоянием?
O>>>Конфигурация.
L>>Конфигурация — это совокупность всех опций или что-то дугое?
O>Комбинация опций на определенном шаге выбора.
Типа этого? http://www.codeproject.com/KB/WPF/wizarddialog.aspx
Здравствуйте, okman, Вы писали:
O>>>Конфигурация.
L>>Конфигурация — это совокупность всех опций или что-то дугое?
O>Комбинация опций на определенном шаге выбора.
Вы себе представляете в какое кол-во состояний это выльется?
Здравствуйте, Lloyd, Вы писали:
L>Вы себе представляете в какое кол-во состояний это выльется?
Конечно представляю.
Но задача не может быть проще, чем она есть на самом деле.
Если шагов больше десяти, и на каждом несколько своих веток, то
тут вообще не важно какой подход применять, потому что вариантов
все равно будет как в шахматах — триллионы.
Здравствуйте, okman, Вы писали:
L>>Вы себе представляете в какое кол-во состояний это выльется?
O>Конечно представляю. O>Но задача не может быть проще, чем она есть на самом деле.
Зато она может быть сделана сложнее на пустом месте. С использованием конечного автомата.
O>Если шагов больше десяти, и на каждом несколько своих веток, то O>тут вообще не важно какой подход применять, потому что вариантов O>все равно будет как в шахматах — триллионы.
void Test(bool a, bool b, bool c, bool d, bool e)
{
if (a)
Console.WriteLine("a");
if (b)
Console.WriteLine("b");
if (c)
Console.WriteLine("c");
if (d)
Console.WriteLine("d");
if (e)
Console.WriteLine("e");
}
Если пишем так, то получаем 5 if-ов. Если зпишем в стиле конечного автомата, то получим 32 if-а.
Вы все еще уверены, что не важно, какой подход применять?
Здравствуйте, Lloyd.
Вы писали:
L>Вы все еще уверены, что не важно, какой подход применять ?
Из вводных данных (весьма скудных): "если на первом шаге выбрано это, то на втором доступны только эти,
либо эти опции" и "количество шагов для выбора у меня планируется >10 с кучей условий на каждом шаге".
L>
L>void Test(bool a, bool b, bool c, bool d, bool e)
L>{
L> if (a)
L> Console.WriteLine("a");
L> if (b)
L> Console.WriteLine("b");
L> if (c)
L> Console.WriteLine("c");
L> if (d)
L> Console.WriteLine("d");
L> if (e)
L> Console.WriteLine("e");
L>}
L>
Только сейчас обратил внимание:
L>Если запишем в стиле конечного автомата, то получим 32 if-а.
Если реализовывать конечный автомат на if-ах, то в этом никакого смысла, разумеется, нет.
Но есть специальные программные фреймворки для построения конечных автоматов,
где комбинации описываются декларативно.
Здравствуйте, okman, Вы писали:
L>>Вы все еще уверены, что не важно, какой подход применять ?
O>Из вводных данных (весьма скудных): "если на первом шаге выбрано это, то на втором доступны только эти, O>либо эти опции" и "количество шагов для выбора у меня планируется >10 с кучей условий на каждом шаге".
Вы не закончили предложение.
L>>
L>>void Test(bool a, bool b, bool c, bool d, bool e)
L>>{
L>> if (a)
L>> Console.WriteLine("a");
L>> if (b)
L>> Console.WriteLine("b");
L>> if (c)
L>> Console.WriteLine("c");
L>> if (d)
L>> Console.WriteLine("d");
L>> if (e)
L>> Console.WriteLine("e");
L>>}
L>>
O>Искусно подобранный пример. И сильно упрощенный.
Ничего искусного, и да, сильно упрощенный. В действительности все будет сложнее.
Здравствуйте, okman, Вы писали:
L>>Если запишем в стиле конечного автомата, то получим 32 if-а.
O>Если реализовывать конечный автомат на if-ах, то в этом никакого смысла, разумеется, нет. O>Но есть специальные программные фреймворки для построения конечных автоматов, O>где комбинации описываются декларативно.
Это не важно, как это записывать. Кол-во таких if-ов == кол-ву состояний конечного автомата. И каждое состояние придется выписывать + выписывать правила перехода. Для пяти входных параметров уже 32 выходных, для заявленных автором 10 будет уже 1024 состояния.
Здравствуйте, Lloyd, Вы писали:
L>Это не важно, как это записывать. Кол-во таких if-ов == кол-ву состояний конечного автомата. И каждое состояние придется выписывать + выписывать правила перехода. Для пяти входных параметров уже 32 выходных, для заявленных автором 10 будет уже 1024 состояния.
Это как раз важно !
Декларативные подходы в таких вещах делают архитектуру намного понятнее и намного легче расширяемой.
Вот пример из мануалов Boost State Machine (transition table), демонстрирующий конечный
автомат для CD-плеера:
Ну напишите то же самое на if-ах — думаете, получится проще ?
А ведь данный фреймворк предоставляет множество вспомогательных методов, if-ами это не переплюнуть.
Здравствуйте, okman, Вы писали:
O>Это как раз важно ! O>Декларативные подходы в таких вещах делают архитектуру намного понятнее и намного легче расширяемой. O>Вот пример из мануалов Boost State Machine (transition table), демонстрирующий конечный O>автомат для CD-плеера:
O>
4 состояния и 9 переходов — это не истересно. Вы перепишите для предложеной задачи и хотя бы для 2-х шагов, тогда и поймете в чем отличие.
O>Ну напишите то же самое на if-ах — думаете, получится проще ?
То же самое — не будет проще. А вот задача топикстартера точне не станет проще, если ее переписать на конечных автоматах.
O>А ведь данный фреймворк предоставляет множество вспомогательных методов, if-ами это не переплюнуть.
Здравствуйте, Lloyd, Вы писали:
L>4 состояния и 9 переходов — это не истересно.
Кто бы сомневался.
L>Вы перепишите для предложеной задачи и хотя бы для 2-х шагов, тогда и поймете в чем отличие.
С какой целью мне это делать ?
Наглядность подхода, использующего state machine, я уже продемонстрировал, пусть на простом
примере, но все же не настолько упрощенном.
То, что состояний будет на порядок больше мне известно, а вот как то же самое
запрограммировать if-ами посмотрел бы.
O>>А ведь данный фреймворк предоставляет множество вспомогательных методов, if-ами это не переплюнуть.
L>Бла-бла-бла.
Расцениваю это как неуважение и дальнейшая дискуссия мне неинтересна.
Здравствуйте, okman, Вы писали:
L>>4 состояния и 9 переходов — это не истересно.
O>Кто бы сомневался.
Зачем тогда приводить пример, который неинтересен в рамках предмета обсуждения?
L>>Вы перепишите для предложеной задачи и хотя бы для 2-х шагов, тогда и поймете в чем отличие.
O>С какой целью мне это делать ?
С целью показать, что этот подход применим к рассматриваемой задаче.
O>Наглядность подхода, использующего state machine, я уже продемонстрировал, пусть на простом O>примере, но все же не настолько упрощенном.
А своим нежеланием рассматривать исходную задачу продемонстрировали неприменимость конечных автоматов в этом случае.
O>То, что состояний будет на порядок больше мне известно, а вот как то же самое O>запрограммировать if-ами посмотрел бы.
А чего там демонстрировать-то?
currentStep.CustomerName.Visible = prevStep.CustomerSelected;
И так для каждого контрола.
O>>>А ведь данный фреймворк предоставляет множество вспомогательных методов, if-ами это не переплюнуть.
L>>Бла-бла-бла.
O>Расцениваю это как неуважение и дальнейшая дискуссия мне неинтересна.
Расцениваю это как слив и можете дальше продолжать не интересоваться этой дискуссией.