Визуальные языки проектирования спецификаций
Таблицы и деревья решений
Структурированный естественный язык неприемлем для некоторых типов преобразований. Например, если действие зависит от нескольких переменных, которые в совокупности могут продуцировать большое число комбинаций, то его описание будет слишком запутанным и с большим числом уровней вложенности. Для описания подобных действий традиционно используются таблицы и деревья решений.
Проектирование спецификаций процессов с помощью таблиц решений (ТР) заключается в задании матрицы, отображающей множество входных условий в множество действий.
ТР состоит из двух частей. Верхняя часть таблицы используется для определения условий. Обычно условие является ЕСЛИ-частью оператора ЕСЛИ-ТО и требует ответа "да-нет". Однако иногда в условии может присутствовать и ограниченное множество значений, например, ЯВЛЯЕТСЯ ЛИ ДЛИНА СТРОКИ БОЛЬШЕЙ, МЕНЬШЕЙ ИЛИ РАВНОЙ ГРАНИЧНОМУ ЗНАЧЕНИЮ?
Нижняя часть ТР используется для определения действий, т.е. ТО-части оператора ЕСЛИ-ТО. Так, в конструкции
ЕСЛИ ИДЕТ ДОЖДЬ ТО РАСКРЫТЬ ЗОНТ
ИДЕТ ДОЖДЬ является условием, а РАСКРЫТЬ ЗОНТ - действием.
Левая часть ТР содержит собственно описание условий и действий, а в правой части перечисляются все возможные комбинации условий и, соответственно, указывается, какие конкретно действия и в какой последовательности выполняются, когда определенная комбинация условий имеет место.
Поясним вышесказанное на примере спецификации процесса выбора символов из входного потока. При выборе символов необходимо руководствоваться следующими правилами:
1) если очередной символ является управляющим, то подать звуковой сигнал и вернуть код ошибки;
2) если буфер формируемой строки заполнен, то подать звуковой сигнал и вернуть код ошибки;
3) если очередной символ не находится в заданном диапазоне, то подать звуковой сигнал и вернуть код ошибки;
4) иначе поместить символ в буфер, увеличить значение счетчика выбранных символов и вернуть новое значение счетчика.
Таблица решений для данного примера выглядит следующим образом (таблица 4.1):
Таблица 4.1
УСЛОВИЯ | |||||||||
C1 | isctrl(c) | Д | Д | Д | Д | Н | Н | Н | Н |
C2 | I > max_lenght | Д | Д | Н | Н | Д | Д | Н | Н |
C3 | out_of_range(c) | Д | Н | Д | Н | Д | Н | Д | Н |
ДЕЙСТВИЯ | |||||||||
D1 | beep() | ||||||||
D2 | return(ERROR) | ||||||||
D3 | return(++i) | ||||||||
D4 | putchar(c) |
Заметим, что если выполняется условие C1, то нет необходимости в проверке условий C2 и C3. Поэтому комбинации условий 1, 2, 3, 4 могут быть заменены обобщающей комбинацией (Д,-,-), где "-" означает любую из возможных альтернатив (в данном случае, Д или Н). Аналогично, комбинации условий 5 и 6 могут быть заменены обобщающей комбинацией (Н,Д,-). Редуцированная таким образом таблица решений будет иметь следующий вид (таблица 4.2):
Таблица 4.2
УСЛОВИЯ | |||||
C1 | isctrl(c) | Д | Н | Н | Н |
C2 | I > max_lenght | - | Д | Н | Н |
C3 | out_of_range(c) | - | - | Д | Н |
ДЕЙСТВИЯ | |||||
D1 | beep() | ||||
D2 | return(ERROR) | ||||
D3 | return(++i) | ||||
D4 | putchar(c) |
Отметим, что на основе таблицы решений легко осуществляется автоматическая кодогенерация. Для вышеприведенного примера соответствующий код может выглядеть следующим образом:
IF (isctrl(c)) { beep(); return(ERROR) } ELSE { IF (i>max_length) { beep(); return(ERROR) } ELSE { IF (out_of_range(c)) { beep(); return(ERROR) } ELSE { putchar(c); return(++i) } } }Построение ТР рекомендуется осуществлять по следующим шагам:
- Идентифицировать все условия (или переменные) в спецификации. Идентифицировать все значения, которые каждая переменная может иметь.
- Вычислить число комбинаций условий. Если все условия являются бинарными, то существует 2**N комбинаций N переменных.
- Идентифицировать каждое из возможных действий, которые могут вызываться в спецификации.
- Построить пустую таблицу, включающую все возможные условия и действия, а также номера комбинаций условий.
- Выписать и занести в таблицу все возможные комбинации условий.
- Редуцировать комбинации условий.
- Проверить каждую комбинацию условий и идентифицировать соответствующие выполняемые действия.
- Выделить комбинации условий, для которых спецификация не указывает список выполняемых действий.
- Обсудить построенную таблицу.
Вариантом таблицы решений является дерево решений (ДР), позволяющее взглянуть на процесс условного выбора с позиции схемы. Дерево решений для вышерассмотренного примера приведено на рис. 4.1
Рис. 4.1. Дерево решений
Обычно ДР используется при малом числе действий и когда не все комбинации условий возможны, а ТР - при большом числе действий и когда возможно большинство комбинаций условий.
Визуальные языки проектирования являются относительно новой, оригинальной методикой разработки спецификаций процесса. Они базируются на основных идеях структурного программирования и позволяют определять потоки управления с помощью специальных иерархически организованных схем.
Одним из наиболее известных подходов к визуальному проектированию спецификаций является подход с использованием FLOW-форм. Каждый символ FLOW-формы имеет вид прямоугольника и может быть вписан в любой внутренний прямоугольник любого другого символа. Символы помечаются с помощью предложений на естественном языке или с использованием математической нотации.
Символы FLOW-форм приведены на рис. 4.2. Каждый символ является блоком обработки. Каждый прямоугольник внутри любого символа также представляет собой блок обработки.
Рис. 4.2. Символы FLOW-форм.
На рис 4.3. приведен пример использования данного подхода при проектировании спецификации процесса, обеспечивающего упорядочивание определенным образом элементов массива и являющегося фрагментом алгоритма сортировки методом "поплавка".
Рис. 4.3. Пример FLOW-формы
Рис. 4.4. Диаграмма Насси-Шнейдермана.
Дальнейшее развитие FLOW-формы получили в диаграммах Насси-Шнейдермана. На этих диаграммах символы последовательной обработки и цикла изображаются также, как и соответствующие символы FLOW-форм. В символах условного выбора и case-выбора собственно условие располагается в верхнем треугольнике, выбираемые варианты - на нижних сторонах треугольника, а блоки обработки - под выбираемыми вариантами. Диаграмма Насси-Шнейдермана для вышеприведенного примера изображена на рис. 4.4.