dmagin (dmagin) wrote,
dmagin
dmagin

Category:

Корень бед языков программирования

лежит вот в этой гибкой конструкции:
Если ОдноУсловие Тогда
Код1;
ИначеЕсли ВтороеУсловие Тогда
Код2;
Иначе
Кодn;
КонецЕсли

Излишняя гибкость данных логических условий провоцирует программистов (особливо самых умных) к стилю "шел дождь и два солдата". То есть часто видим примерно такое:

Если ОднаПеременная = 1 Тогда
Код1;
ИначеЕсли ДругаяПеременная = 2 Тогда
Код2;
ИначеЕсли ТретьяПеременная = 3 Тогда
Код3;
КонецЕсли

Разбираться в такой логике противно. Причина - смена основания деления в каждом логическом условии. К тому же как правило программисты внутрь одного логического блока любят вставлять еще несколько других, получая в итоге "ужас-ужас".

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

Преимущество ФЗ также в том, что можно контролировать однозначность логики. То есть либо не допускать (предупреждать о неоднозначности) логических блоков типа

Если Переменная >= 1 Тогда
Код1;
ИначеЕсли Переменная >= 2 Тогда
Код2;
КонецЕсли

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

В виде ФЗ (регистра) приведенный выше логический блок можно записать примерно так:

Switch(Переменная) {
>=1 : Код1,
>=2 : Код2,
}

Тогда с учетом релевантности для значения переменной 3 выполнится Код2, поскольку мощность интервала >=2 меньше мощности интервала >=1.

Условия можно соединять по "Или" - это просто перечисление значений основания:

Switch(Переменная) {
=(1, 2) : Код1,
>=3 : Код2,
V : Код3
}

Через V обозначен универсум,- здесь он используется для задания "кода по умолчанию", поскольку релевантность универсума всегда минимальная.

Если ФЗ содержит несколько переменных основания, то условия на их значения перечисляются через запятую:

Switch(Var1, Var2) {
=(1, 2), =3 : Код1,
>=3, =1 : Код2,
V, =1 : Код3,
V, V : Код4
}

Логические ошибки наиболее сложны в локализации и исправлении. Их профилактика окупится многократно. Так что при существующих темпах роста количества кода (и ошибок) конструкцию "if then else" пора отправлять по маршруту "goto".
Tags: Программирование, Структуры данных
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 5 comments