Книга посвящена изложению методов трансляции с одного из непроцедурных языков программирования — с языка таблиц решений. Программы, написанные на этом языке, позволяют удобно описывать сложные ситуации, возникающие при системном анализе. Таблицы решений представляют собой новый перспективный метод программирования, который находит применение при решении многих задач системного анализа.

Книга предназначена для разработчиков АСУ, системных аналитиков и системных программистов, занимающихся разработкой трансляторов. Она может служить учебным пособием для студентов, изучающих методы трансляции.

Хамби Э. Программирование таблиц решений / Э. Хамби, 1-е изд., Москва: Издательство «МИР», 1976. 86 c.

О книге узнал из комментария к статье на Хабре


Легкая изменяемость программ - следствие систематического (или все же системного?) подхода к разработке. Один из симптомов такого подхода - использование таблиц, см. Табличные методы. В таблицы, как правило, выносятся более часто изменяющиеся параметры процесса, другими словами, вычислительные состояния, а вот сама программа / алгоритм - это управляющие воздействия, которые изменяются гораздо реже. Таким образом, использование таблиц - это возможная реализация Single Responsibility Principle.

Получается еще одна иллюстрация принципа разделения кода на отдельные сущности по частоте изменений.

Структура таблиц решений

  1. Начало условия - перечисление интересующих нас параметров состояния системы, в терминах таблиц решений они называются Условия.
  2. Тело условия - различные возможные значения параметров системы, в терминах таблиц это состояний Условий.
  3. Начало действия - названия возможных результатов вычислений по таблице.
  4. Тело действия - отметки о соответствии действия правилу.

Каждый столбец с комбинациями состояний Условий и соответствующими Действиями называется Правило.


Типы таблиц

Начала условий могут быть сформулированы так, чтобы они стали булевыми функциями. Таблица с только такими условиями называется таблица с ограниченным входом. Если же условие может принимать несколько разных значений, то такая таблица называется таблица с расширенным входом. Для таблиц с расширенным входом важно, чтобы отдельные значения условия не пересекались и покрывали весь возможный диапазон значений.

Таблица с ограниченным входом является частным случаем таблиц с расширенным входом. Допустим, что все допустимые значения условий пронумерованы, и последний номер (группа) включает в себя все не заданные явно значения условия. Тогда таблицу с ограниченным входом можно рассматривать как таблицу с расширенным входом, у которой для каждого условия есть какое-то особое значение (например, true) и какое-то другое значение, объединяющее все остальные. Вероятно, это может привести к тому, что с любыми типами таблиц можно работать единообразно.


Сокращения

Есть два варианта сокращения длинных таблиц.

Во-первых, можно использовать какой-нибудь спец.символ, например “тире”, для отметки о том, что для данного правила значение данного условия неважно. Это дает возможность не дублировать правила. Однако нужно четко следить, не появится ли двусмысленность в определении действий, т.к. возможна ситуация, в которой одновременно будут выполняться два или более правил, ведущих к двум или более действиям.

Во-вторых, можно использовать специальный столбец “ИНАЧЕ”, в который будут попадать все правила, не описанные в таблице явно. У этого способа тоже есть недостаток, связанный как раз с этой неявностью - сложно проверить и гарантировать, что в таблице явно перечислены все значимые с точки зрения поведения варианты. К тому же расширение таких таблиц чревато ошибками ложного попадания в столбец “ИНАЧЕ”.


Далее в книге рассматриваются методы оптимизации последовательности проверок с учетом стоимости (по времени и памяти) каждой проверки и предполагаемой вероятности попадания в каждое правило. Этими методами однозначно стоит воспользоваться в реальной работе, особенно в случае, когда условий и правил много.


Самая главная находка в книге - это метод записи таблиц решений, который допускает множественные действия. В моих текущих рабочих реалиях такая запись позволит сократить количество используемых таблиц/файлов, а значит, и количество проверок.