Почему важно выражать код в дизъюнктивной нормальной форме? - PullRequest
4 голосов
/ 04 июля 2011

В компании, в которой я работаю, недавно был выдан мандат на то, чтобы вся «очень наглядная» логическая логика была выражена в дизъюнктивной нормальной форме.

Так, например (хотя концепция не зависит от языка),

#if (defined(A) || defined( B )) || (defined(C) && defined(D))

пришлось заменить на:

#if defined(A) || (defined(C) && defined(D)) || defined(B)

Какова мотивация для того, чтобы обязать этот код быть выраженным таким образом? Каковы преимущества?

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

Преимущество состоит в том, что выражение такой логики в канонической / нормализованной форме везде в пределах кодовой базы (теоретически) облегчит программистам ее понимание и поддержку.

Без такого правила некоторые программисты способныпопытайтесь «оптимизировать» выражение таким образом, чтобы сопровождающему стало трудно его распутать.Кроме того, общая форма облегчает создание новых выражений, если в этом возникает необходимость.

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

1 голос
/ 04 июля 2011

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

Предполагая, что перечисленные вами стандарты действительно помогают. Я бы сказал, что большинство людей не понимают, что оператор && имеет более высокий приоритет оператора, чем || поэтому использование () вокруг оператора && и операндов помогает сделать вещи более явными.

Всегда помните, что во многих языках оба операнда логического выражения могут не выполняться, если значение выражения можно определить после вычисления только одного из операндов. Такие как:

1: (trueMethod () || falseMethod ())

2: (falseMethod () || trueMethod ())

В случае, если выполняется только один trueMethod (). Но в случае 2 оба метода выполняются. Заказ может иметь большое значение.

1 голос
/ 04 июля 2011

Хотя ваш пример очень плохой (оба выражения даны в DNF), я понимаю, почему кто-то навязывает эту политику.

Любая нормальная форма имеет преимущество в том, что все выражения теперь имеют одинаковую форму. В DNF эта форма представляет собой список предложений / условий, одно из которых должно быть истинным. Пункты в свою очередь являются списками литералов / условий, каждый из которых должен быть истинным.

DNF обладает тем преимуществом, что в большинстве синтаксисов и имеет более высокий приоритет, чем или , а не имеет даже более высокий приоритет, поэтому DNF требует меньше скобок чем CNF и опуская скобки не является ошибкой.

...