0. tormozit 5611 20.09.12 00:02 Сейчас в теме

Оформление и рефакторинг сложных логических выражений

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
99. tormozit 5611 15.11.17 10:37 Сейчас в теме
Результаты опроса http://www.forum.mista.ru/topic.php?id=807921 показали, что соотношение программистов, которые сразу понимают, которые понимают более чем через 10 секунд, которые не понимают, корректировано составляет
4:1:1
С учетом того, что после нескольких прочтений, вторая категория научится машинально это читать, получается соотношение понимающие:непонимающие
5:1 или 84:16%.
100. grumagargler 613 15.11.17 18:04 Сейчас в теме
(99) посмотрел опрос, посмортел тему, не увидел связи.
Стоило бы добавить в опрос тех, кто считает наличие указанных конструкций неприемлемым в конструкции Если. Интересно было бы посмотреть соотношение.
корректировано составляет

как вы считали соотношение 4:1:1?
101. tormozit 5611 15.11.17 18:24 Сейчас в теме
(100)
В опросе задан вопрос о скорости понимания выражений "Ложь Или А" и "Истина И Б", которые являются ключевыми для описанной здесь методики и вносят основное усложнение по отношению к минимальному виду выражения.
Корректировку результата опроса выполнил по комментариям тех, кто выбрал вариант "непонятно". 3 из них продемонстрировали явные признаки понимания, а вариант ответа по моему мнению выбрали в качестве негативной реакции на описанную здесь методику. Поэтому 36:11:9 превратились в 39:8:9, что после сокращения на 9 приблизительно превращается в 4:1:1
102. tormozit 5611 15.11.17 18:37 Сейчас в теме
(100) "Считать неприемлемыми" это близко к разряду "нравится/не нравится". Я исследовал более конкретный аспект влияния на скорость восприятия выражений программистами, то есть как много из них не смогут прочитать такое выражение и поэтому не смогут сопровождать такой код. А с непривычки людям многое не нравится, хотя если они попробуют, то могут и изменить свое отношение.
103. grumagargler 613 15.11.17 19:02 Сейчас в теме
(102) Почти любая разумная языковая конструкция рано или поздно будет читаться быстро, дело тренировки, как правило непродолжительной, и этим я думаю можно пренебречь. В этом смысле мне показался этот опрос странным для того, чтобы на его основании делать какие-то выводы, и как-то даже специально созданным под результат, но это ваше право.
А вот статистику тех, кто такие условия писать не будет, вы не учитывали, а я думаю, что эта статистика тоже была бы полезной в общем контексте. Почему не будут, в силу косности мышления, привычек, или потому что считают, что такой код потенциально опасный, является следствием неверной логики и так далее - уже дело быть может другого опроса.
104. tormozit 5611 15.11.17 21:59 Сейчас в теме
(103) Я придумал и обкатал методику. Я честно расписал ее плюсы и минусы. В первую очередь я сделал это для тех, кто будет работать с моим кодом, и для тех, кто сочтет методику уместной для разумного самостоятельного применения. Считать, сколько программистов с первого взгляда сочли ее полезной для себя и сколько нет, мне неинтересно. Однако я чувствую, что вы очень хотите и поэтому я напишу это - признаю, что большинству разработчиков эта методика с первого взгляда кажется неполезной и поэтому столь желанный вами опрос конечно же показал бы безоговорочную победу скептиков. Надеюсь, теперь вам станет легче =)
105. grumagargler 613 15.11.17 22:45 Сейчас в теме
(104) Я не знал, что эта статья была опубликована в первую очередь для тех, кто будет работать с вашим кодом. Допустите мысль, что не вы один думаете над вопросами качества кода, его оформления и философией. И я не зашел тут со стороны и решил покритиковать увидев незнакомую конструкцию. Я против вашего подхода, не потому что я скептик, а потому что считаю его вредным, и ваше голосование в данном случае как будто что-то доказывает, но по сути – вводит в заблуждение, потому что не учитывает мнение всей группы интересующихся.
Конечно, никто не отрицает, что ваш подход работает, никто не отрицает что могут быть два совершенно противоположных подхода, дающих одинаковый результат. Но раз вы публикуете для общественности материал, и даже создаете голосование, то уж будьте добры слушать и что другие думают по этому поводу.
106. tormozit 5611 15.11.17 23:14 Сейчас в теме
(105) Кажется я вполне слушал других, включая вас, как здесь так и в опросе. Поэтому мне непонятна ваша просьба "будьте добры слушать и что другие думают по этому поводу". Конкретизируйте пожалуйста, где я не слушал.
107. grumagargler 613 15.11.17 23:19 Сейчас в теме
(106)
Эта фраза меня удивила:
Считать, сколько программистов с первого взгляда сочли ее полезной для себя и сколько нет, мне неинтересно

первый взгляд у всех разный. У некоторых - он действительно первый, но ведь не у всех.
108. tormozit 5611 15.11.17 23:28 Сейчас в теме
(107) Как связано, что мне неинтересно считать соотношение программистов, которым нравится и не нравится, со "слушать и что другие думают по этому поводу"? Иначе говоря, "слушать" и "считать" - довольно разные глаголы. Я всех слушал. А считал в том разрезе, который имеет практическую пользу для сторонника рассматриваемой методики. Вы явно хотите выставить меня в негативном свете. Возможно даже сами этого не осознаете.
109. grumagargler 613 15.11.17 23:49 Сейчас в теме
(108) Вы создали интересную публикацию, противоречивая дискуссия развернулась в комментариях, и настолько, что вы создаете голосование, результаты которого публикуете тут. Делаете это, с определенной целью - доказать предложенный подход (иначе зачем вообще было устаивать голосование). Вроде всё так?
Но есть проблема – ваше голосование не учитывает мнение хорошей доли участников, которые здесь высказывались по поводу статьи. И это мнение, насколько я понял, вам не интересно (слушать, считать, принимать во внимание, и т.д. выбирайте глагол сами), потому что вы твёрдо уверены, подход работает. Вам интересно, согласно голосования, сколько из тех, кто уже так делает, понимает, что он делает и сколько тратит на это времени.
p.s. в голосовании я не участвовал
110. tormozit 5611 16.11.17 09:10 Сейчас в теме
(109) Вы настойчиво делаете неверные умозаключения о моих целях. Я многократно четко обозначил цель опроса, а вы продолжаете не смотря на это пытаться приписать моему опросу другие цели.
И это мнение, насколько я понял, вам не интересно
Снова нечистый дискуссионный прием. Вам не кажется, что вы неуважительно ведете дискуссию?

Если вам так уж хочется какого то другого опроса, то создайте его сами и укажите здесь ссылку.
113. grumagargler 613 16.11.17 17:34 Сейчас в теме
(110)
И это мнение, насколько я понял, вам не интересно
Снова нечистый дискуссионный прием. Вам не кажется, что вы неуважительно ведете дискуссию?

Я высказываю свое мнение, здесь нет никаких приемов и неуважения.
Нечестный прием послужил поводом моего участия в этой дискуссии с сообщения 99.
111. vlad.frost 186 16.11.17 14:02 Сейчас в теме
https://www.sonarsource.com/docs/CognitiveComplexity.pdf
Ещё одну ссылку здесь приведу - это исследование на предмет когнитивной сложности кода.
То, насколько код легко поддаётся пониманию - прямое следствие, насколько дорого вам обойдётся его последующая поддержка.
Сложный код требует больше времени на понимание, а время - деньги.
В частности, в этом документе есть раздел, поясняющий за последовательность логических операторов.
Там отмечается, что когнитивная сложность логического выражения увеличивается с каждой новой последовательностью одинаковых операторов.
Пример расчета сложности фрагмента кода по этой методике:
Если (ВыражениеА // +1 к сложности за "Если"
 И ВыражениеБ И ВыражениеВ // +1
 ИЛИ ВыражениеГ ИЛИ ВыражениеД // +1
 И ВыражениеЕ) // +1
Если (ВыражениеА // +1 к сложности за "Если"
 И // +1
 Не (ВыражениеБ И ВыражениеВ)) // +1
Прикрепленные файлы:
tormozit; +1 Ответить
112. tormozit 5611 16.11.17 14:37 Сейчас в теме
(111) Интересно. Но непонятно, почему там не прибавляют очки сложности за скобки в выражении. Может быть я не нашел просто?
114. karimov_m 25.12.17 19:17 Сейчас в теме
А еще есть Польская нотация (префиксная запись), там вообще все без скобок)) Но вот, мягко говоря, это никак не добавляет к читаемости кода=)
115. ildarovich 6742 25.12.17 22:43 Сейчас в теме
Я бы разделил выводы статьи на две части:
1) Условия в предложении ЕСЛИ должны записываться в дизъюнктивной нормальной форме;
2) Для придания красивости можно записывать их в виде дерева, для обозначения узлов которого можно использовать незначащие ЛОЖЬ и ИСТИНУ.

По поводу п.2, мне кажется, что это дело вкуса или привычки. Если кому не нравится, я бы настаивать не стал.

А вот по первому пункту есть надежное обоснование. Оно вытекает из теории вычислительной сложности. Читая условие, компьютер у нас в голове "решает" уравнение f(x1, ..., хk) = true, где f - логическая функция, чтобы определить случаи срабатывания этого условия. То есть решает задачу SAT.
Если функция записана, например, в КНФ, то сложность решения уравнения высока, более того, в общем случае она равна NP! А запись функции в ДНФ по сути и является решением, то есть по такой записи легко определить наборы значения переменных, при которых будет срабатывать условие.

Другое дело, что преобразование в ДНФ при всей простоте правил Де Моргана в общем случае может оказаться проблемой.
Попробуйте, например, представить в рекомендованном виде вот такое условие:
Если (Условие1 ИЛИ Условие2 ИЛИ Условие3) И (Условие4 ИЛИ Условие5 ИЛИ Условие6) 
И (Условие7 ИЛИ Условие8 ИЛИ Условие9) И (Условие1 ИЛИ Условие4 ИЛИ Условие7) Тогда
Будем надеяться, что такие случаи встречаются редко?
116. karimov_m 26.12.17 13:49 Сейчас в теме
(115) да.. не удобно получится.
Я тоже пропагандирую "иерархический подход", если много условий. Тогда и отладка легче идет и все видно по группам.
Т.е.
бЛогическаяГруппа1 = (Условие1 ИЛИ Условие2 ИЛИ Условие3);
бЛогическаяГруппа2 = (Условие4 ИЛИ Условие5 ИЛИ Условие6);
бЛогическаяГруппа3 = (Условие7 ИЛИ Условие8 ИЛИ Условие9);
бЛогическаяГруппа4 = (Условие1 ИЛИ Условие4 ИЛИ Условие7);

Если бЛогическаяГруппа1 И
         бЛогическаяГруппа2 И         
         бЛогическаяГруппа3 И
         бЛогическаяГруппа4 
Тогда

КонецЕсли;
Показать
117. ditp 50 26.12.17 15:19 Сейчас в теме
(116) Вот только вычислений будет в четыре раза больше. В некоторых случаях.
118. karimov_m 26.12.17 15:26 Сейчас в теме
(117) ну тут речь о булевой алгебре т.е. суть битовые операции, т.е. суть современные процессоры сжуют этот код (при должной компиляции) за пару тактов. Это если на С например такое написать... Но ок, речь о стековой машинке 1С, с виртуальной машинкой внутри, но даже при таких жестких расходных ресурсах - скорость вычисления такого блока - микросекунды. Но да, если вы пишите ПО для спутникового оборудования на 1С (что нереально конечно-же=), будет не комфортно))
Для бизнес задач и вычислений - фактически - не имеет значения вообще как будет записаны такие выражения - тут речь строго о стилистике. Т.к. внутри 1С, код будет приведен к более менее одному составу команд и логических прыжков на подпрограммы
119. ditp 50 26.12.17 15:59 Сейчас в теме
Так-то да, но частенько вместо
(Условие1 ИЛИ Условие4 ИЛИ Условие7)

бывает
(ВычислениеУсловие1() ИЛИ ВычислениеУсловие4() ИЛИ ВычислениеУсловие7())
а за каждой () - тыща строк.
120. karimov_m 28.12.17 15:58 Сейчас в теме
(119) это уже подпрограммы, сам переход в них и возврат из них - не особо стоимостный по времени. А уж что там внутри функций - тут уже проблема другой плоскости. Код этих функций (ВычислитьВыражение1()..) - можно не обрамлять в виде функции. Т.е. оформление конечной проверки (Если Выражение1 Тогда) и результата и скорость ее вычисления никак не связано с ее операндами (они всегда статичны булевы) - определение начальных значений и последующий вычисления, основанные на ветвлении выражения - имеет значения в анализе скорости.
123. lrs 27 19.03.18 14:17 Сейчас в теме
А просто лишние скобки в одну итерацию убрать не?
К тому же автор со своей методикой ошибся при раскрытии скобок.
Правильно:
Если НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5"
Или (НомерИзменяемойКолонки = "7" Или НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7) Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
У автора результат:
Если НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Или НомерИзменяемойКолонки = "7"
Или (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7) Тогда
Расчет(ГруппаРасчета);
КонецЕсли;
124. tormozit 5611 19.03.18 14:57 Сейчас в теме
(123) Выражения
НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5"
Или (НомерИзменяемойКолонки = "7" Или НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7)
и
НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Или НомерИзменяемойКолонки = "7"
Или (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7)
равнозначны, т.е. дают одинаковое значение на всем множестве значений входных параметров. Если не веришь, это легко проверить в консоли кода.
А1 = НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5"
	Или (НомерИзменяемойКолонки = "7" Или НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7);
А2 = НомерИзменяемойКолонки = "4" Или НомерИзменяемойКолонки = "5" Или НомерИзменяемойКолонки = "7"
	Или (НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7);
125. binx 84 20.04.18 23:08 Сейчас в теме
На мой взгляд, все эти логические построения из булевой алгебры делают понятным код только тому кто его написал, если автор предполагает шарить код с другими программистами, лучше сделать код нагляднее отступами, либо вообще изменить условие чтобы код стал понятным, например вместо чисел подставить именованные константы, или объединить группу условий под одним логическим выражением
ПонятноеИзКонтекстаУсловие = (НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5")
//тем самым само условие упрощается и будет читаться как предложение
Если  ПонятноеИзКонтекстаУсловие  Или ВтороеПонятноеИзКонтекстаУсловие Тогда
126. tormozit 5611 20.04.18 23:21 Сейчас в теме
(125)
все эти логические построения из булевой алгебры делают понятным код только тому кто его написал
Я описал четкую методику и потому все освоившее ее будут записывать выбранные выражения в единой системе. И раз уж каждый из них будет понимать записанное собой выражение в предложенном виде, то и другие будут понимать то же выражение, т.к. они бы смогли записать его ровно в том же виде.
evgen7938; +1 Ответить
127. evgen7938 7 13.01.19 11:17 Сейчас в теме
(126) Самый крутой 1С-ник из всех мне известных описал методику, изложил факты и свои соображения по этому поводу.
Хотите - пользуйтесь, не хотите - не пользуйтесь.

Сергей, очень благодарен Вам за ИР, считаю, что это очень круто! :)
По мне, Вы легендарная личность.
Скажите пож-та, можно ли о Вас узнать побольше?
user774630; +1 Ответить
128. MikhailDr 17.07.19 07:56 Сейчас в теме
"Для повышения наглядности вставляем в начало группы операцию с не нарушающим результат вычисления группы константным значением."

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

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Технический лидер, архитектор 1С, руководитель проектов
Санкт-Петербург
зарплата от 150 000 руб.
Полный день

Ведущий 1С консультант по БГУ
Омск
зарплата от 50 000 руб. до 95 000 руб.
Полный день

Специалист внедрения и сопровождения 1С
Омск
зарплата от 25 000 руб. до 50 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству