Всем привет.
Необоходимо реализовать условие логического выражения:
В общем выглятит так
П -> К -> Д
П — предусловие
К — условие
Д — действие.
Так вот если для предусловия П истино условие Д тогда действие. Вся сложность в реалзиации К условия: хотелось чтобы оно было максимльно гибким (если так можно выразиться). Объясню подробнее.
Условие должно состоять из группы или одного объектов. Объекты должны связываться между собой по связи И, ИЛИ, ну и может отрицание условия. Т.е.
На данной схеме объект k это объект условия, причем связь по горизонтали это логическое И а по вертикали логическое ИЛИ. Включив ещё и отрицание можно будет из объектов конструировать услвия любой сложности. И ещё было бы классно еслиб любой объект ki мог быть созатвным из k1...kz, например
|-k1 - k2 - ... - ke -|
|--- k1 ----|-k3 - ..............-|--- kn ---|
| |- ..................-| |
К = ---|--- k4 --- k6 --- ............... --- ky ---|---
| |
|----k25--- k2 --- ............... --- km ---|
Причём релизовать это надо в таких объектах которые было бы легко хранить в СУБД и удобно работать в программе.
Класс Word — условие k.
Класс Sentence — массив Word, логически соединенных по И.
Класс Condition — Массив Sentence, логически соединенных по ИЛИ.
У всех классов будет метод match(), который будет возвращать логический результат true/false.
Word::match(object initialСondition)
{
if (... если удачно скрестили initialСondition и m_word (условие k))
return true;
else
return false;
}
Sentence::match()
{
bool result;
foreach(Word word in m_words)
{
result |= word.match();
}
}
Condition::match()
{
bool result;
foreach(Sentence sentence in m_sentence)
{
result &= sentence.match();
}
}
Названия классов и сам код условны. Еще можно оптимизировать, например, если result в цикле Condition станет равен 0, то сразу возвращаем false. Тоже самое в и Sentence.
Хотелось бы иметь один объект k который мог представлять как одно простое выражение так и все ветки что я рисовал. И я что то не понял как предложеные Вами объекты уложить в одну таблицу СУБД (я, конечно, не говорил ранее что хотелось бы в одну таблицу, извините).
Здравствуйте, Time, Вы писали:
T>Здравствуйте, Jax
T>Хотелось бы иметь один объект k который мог представлять как одно простое выражение так и все ветки что я рисовал. И я что то не понял как предложеные Вами объекты уложить в одну таблицу СУБД (я, конечно, не говорил ранее что хотелось бы в одну таблицу, извините).
Вроде так и есть, т.е. K — это Condition, а kij — это Word.
Храниться это будет так: столбцы — элементы массива Sentence, строки — элементы массива Condition (ячейка — это Word).
Если предусловие изменяемо и требует хранения, то не могу ничего полезного придумать. Если же предусловие не требует хранения, то все Word расчитываются и после уже записываются в БД.
Ошибся в коде немного
Sentence::match()
{
bool result;
foreach(Word word in m_words)
{
result &= word.match();
}
}
Condition::match()
{
bool result;
foreach(Sentence sentence in m_sentence)
{
result |= sentence.match();
}
}
Не надо ко мне на Вы, я один, меня не много. Не люблю формальности, по крайней мере не к месту, а тут не место
Здравствуйте, Time, Вы писали:
GZ>>Платформа-то какая?
T>.Net 3.5, SQL Server 2005 SP2
Тогда в чем проблема. В Linq есть получение AST дерева, точно также там можно его восстановить. Условия писать на основе лямбд. Там же все это уже есть.