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

17.02.24

Разработка - Рефакторинг и качество кода

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

Возьмем для примера фрагмент кода из типовой бухгалтерии

Если ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда
    Расчет(ГруппаРасчета);
КонецЕсли;

Не правда ли от количества скобок "рябит в глазах"? Конечно скобки иногда необходимы для расстановки последовательности вычисления, но записывая их линейно в таком количестве мы заметно усложняем восприятие (читаемость) выражения.

Приоритеты логических операций

Для начала вспомним приоритеты логических операций. Сначала выполняется Не, потом И и затем Или. Скобки традиционно имеют наивысший приоритет выполнения и гарантируют порядок выполнения вложенных в них операций. Однако их избыточное применение создает продемонстрированные в примере трудности. Зачастую скобки ставят лишь для того, чтобы перестраховаться в сложных и плохо читаемых логических выражениях.

Методика И-ИЛИ дерева

Я же предлагаю сложные логические выражения оформлять в виде И-ИЛИ дерева. Под И-ИЛИ деревом я подразумеваю дерево, нетерминальные узлы которого представляют собой группы (последовательности) одинаковых логических операций И или ИЛИ, а терминальные - остальные логические выражения. Хорошим примером такого дерева является отбор настроек компоновки данных, правда у него верхняя (корневая) группа всегда имеет тип "И". В случае встроенного языка мы этим не ограничены и можем использовать любой тип верхней группы. В рассмотренном примере как раз сверху расположена группа "ИЛИ".

1. Встаем на первую открывающую скобку и с помощью сочетания клавиш CTRL+] находим тело первого узла и переносим целиком в одну следующую строку с отступом относительно слова Если

Если
    ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
И (ГруппаРасчета = мИдГруппы7))) Тогда

2. Следующий логический оператор будет И или ИЛИ. Он и определяет тип группы этого уровня при условии что все группы обрамлены скобками. Для повышения наглядности вставляем в начало группы операцию с не нарушающим результат вычисления группы константным значением. Для И это будет ИСТИНА, а для ИЛИ это будет ЛОЖЬ. ИСТИНА не меняет результат конъюнкции (ИСТИНА И), и ЛОЖЬ не меняет результат дизъюнкции (ЛОЖЬ ИЛИ). Рассмотрим преобразование выражения примера к И-ИЛИ дереву.

Если Ложь
    Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
    Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8")
    И (ГруппаРасчета = мИдГруппы7))) Тогда

3. Встаем на следующую открывающую скобку корневого уровня и повторяем шаг 1.

Если Ложь
    Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
    Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7))) Тогда

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

Если Ложь
    Или ((НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5"))
    Или (((НомерИзменяемойКолонки = "7") Или (НомерИзменяемойКолонки = "8") И (ГруппаРасчета = мИдГруппы7)))
Тогда

5. Далее повторяем шаги 1-3 для всех вложенных узлов (условий в скобках). Следует заметить, автор оригинального выражения не все группы обрамил скобками и последние 2 оператора из числа образующих группы различны и не разделены скобками. В итоге получаем

Если Ложь
    Или (Ложь
        Или (НомерИзменяемойКолонки = "4")
        Или (НомерИзменяемойКолонки = "5"))
    Или (Ложь
        Или (НомерИзменяемойКолонки = "7")
        Или (Истина
            И (НомерИзменяемойКолонки = "8")
            И (ГруппаРасчета = мИдГруппы7)))
Тогда

6. Теперь нам становится понятно, что логическое выражение можно упростить. Все вложенные однотипные (И или ИЛИ) группы можно смело всегда поднимать в родительскую группу.

Если Ложь
    Или (НомерИзменяемойКолонки = "4")
    Или (НомерИзменяемойКолонки = "5")
    Или (НомерИзменяемойКолонки = "7")
    Или (Истина
        И (НомерИзменяемойКолонки = "8")
        И (ГруппаРасчета = мИдГруппы7))
Тогда

7. В таком виде уже можно довольно безопасно убрать скобки вокруг условий внутри строк. В итоге получаем

Если Ложь
    Или НомерИзменяемойКолонки = "4"
    Или НомерИзменяемойКолонки = "5"
    Или НомерИзменяемойКолонки = "7"
    Или (Истина
        И НомерИзменяемойКолонки = "8"
        И ГруппаРасчета = мИдГруппы7)
Тогда

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

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

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

 

Думаю, что эту методику можно успешно применять не только к встроенному языку 1С, но и многим другим языкам.

Использую эту методику уже много лет.

Плюсы:

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

Минусы:

- не все сразу понимают чисто оформительское назначение "Истина И" и "Ложь Или"
- уходит больше времени на начальное написание выражения
- выражение занимает большее число строк
- часто не оправдывает себя в простых выражениях
- автоформатирование кода выравнивает все строки условия по одной границе, но в ИР команда с поддержкой такого оформления
- выражение незначительно дольше вычисляется

Шаблоны

Для удобства написания сложных логических выражений по этой методике рекомендую добавить себе шаблоны

Условие с корневой группой "И" -

Если Истина
    И <?> 
Тогда
КонецЕсли;

Условие с корневой группой "Или"

Если Ложь
    Или <?>
Тогда
КонецЕсли;

логические выражения

См. также

Когда понадобился новый оператор

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда понадобился новый оператор, но его нет в синтакс-помощнике, что делать?

18.03.2024    1139    ZhokhovM    2    

4

Когда разработчик платформы не добавил проверку препроцессоров

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Когда разработчик платформы решил пойти на кухню за кофе, а проверку препроцессоров не добавил, и вот тут-то и началось: "Что, опять все сломалось? Ну и кофе же я забыл сделать!".😅

18.03.2024    2670    ZhokhovM    4    

8

Реструктуризация - бесконечная история

Рефакторинг и качество кода Платформа 1С v8.3 Бесплатно (free)

При разработке программ требуемый функционал ставят на первое место, но есть еще и архитектура программы. На горизонте 5-10 лет она становится важнее функционала, который должен работать при масштабировании и росте данных. Реструктуризация 5 терабайтной базы 1С 8.2 в формат 1С 8.3, складывает весь пазл архитектурных просчетов, которые сделали ради функционала. Как это исправить? - для разработки правильной архитектуры, нужно всего лишь сместить фокус с функционала и подумать о «вечном».

29.09.2023    1907    1CUnlimited    15    

22

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Коротко о том, как я перестал быть создателем макаронного кода и непроходимых джунглей методов и модулей. Расскажу о том, что реально применяю на практике с примерами при разработке (а в основном доработке) в типовых конфигурациях 1С. Комментарии очень приветствуются.

27.09.2023    6965    Lemmonbri    136    

36

Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 1

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Коротко о том, как я перестал быть создателем макаронного кода и непроходимых джунглей методов и модулей. Расскажу о том, что реально применяю на практике с примерами при разработке (а в основном доработке) в типовых конфигурациях 1С. Комментарии очень приветствуются.

19.09.2023    4344    Lemmonbri    16    

31

5 подходов при доработке конфигурации 1С, чтобы в будущем не было мучительно больно её обновлять

Архитектура Рефакторинг и качество кода Обновление 1С Платформа 1С v8.3 Бесплатно (free)

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

10.08.2023    9582    0    1c-izhtc    37    

21

Задача на ошибки и неоптимальности при проведении приходной накладной

Рефакторинг и качество кода Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Задачу эту дают на собеседованиях, видимо, те франчи, которые не в состоянии оценить человека по резюме и в ходе беседы. По идее задачи, подобные этой, должны давать начинающим студентам. Но дают всем подряд. Итак: мои 5 копеек. Критика приветствуется.

11.07.2023    2214    magic1s    32    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
93. rpgshnik 3631 10.11.17 05:24 Сейчас в теме
(91)
	Если ЛОЖЬ 
		ИЛИ НомерИзменяемойКолонки = "4" 
		ИЛИ НомерИзменяемойКолонки = "5"		
		ИЛИ НомерИзменяемойКолонки = "7" 
		ИЛИ (ИСТИНА
		И НомерИзменяемойКолонки = "8" 
		И ГруппаРасчета = мИдГруппы7)  //нормально комментируется
		Тогда	
		Расчет(ГруппаРасчета);
	КонецЕсли;
Показать
94. rpgshnik 3631 10.11.17 05:26 Сейчас в теме
В результате форматирования будет выглядить всё так:

	Если ЛОЖЬ 
		ИЛИ НомерИзменяемойКолонки = "4" 
		ИЛИ НомерИзменяемойКолонки = "5"		
		ИЛИ НомерИзменяемойКолонки = "7" 
		ИЛИ (ИСТИНА
		И НомерИзменяемойКолонки = "8" 
		И ГруппаРасчета = мИдГруппы7)
		Тогда	
		Расчет(ГруппаРасчета);
	КонецЕсли;
Показать


Неоднозначный подход конечно, вроде бы интересно, но в то же время смущают эти ЛОЖЬ ИЛИ и ИСТИНА И, возможно попробую методику. Но в начальном примере реально было жутко много скобок, которые можно было просто убрать и облегчить читабельность)))
95. acsent 1199 10.11.17 18:07 Сейчас в теме
Вообще первичное удаление скобочек называется: приведение к дизъюнктивной нормальной форме
98. IntelInside 128 13.11.17 19:50 Сейчас в теме
Сложные и многоэтажные логические конструкции сложны для понимания. Это зло профессии и не нужно их дополнительно усложнять. Их надо нещадно рефакторить и сводить к простым. Правдо это долго.
Фактически Вы сводите логическую конструкцию к легко читаемому виду, где в начале каждой строки стоит условие.
Для И получается легко читаемое на одном дыхании ЕСЛИ ИСТИНА-И-Условие_а-И-Условие_б. Но для ИЛИ получается ересь читаемая как ЕСЛИ ЛОЖЬ-ИЛИ-Условие_а-ИЛИ-Условие_б.
По моему, если условие не очень многоэтажное, то оно и так может читаться при хорошем форматировании. А если условие строк эдак на 15-20, то его Ваша форма только дополнительно усложнит. Его надо рефакторить.

ПС. Спасибо за мысль. а) буду делать дополнительные оптимизации к своему компилятору. б) при расширении грамматики подумаю над возможностью опустить первый операнд И\ИЛИ: ЕСЛИ И Условие_а И Условие_б; ЕСЛИ ИЛИ Условие_а ИЛИ Условие_б.

ППС. Можно завести себе для красоты константы или пока функции:

(Фантазии, перспектива)
Конст ИстинаЛюбое = Ложь ЭКСПОРТ
Конст ИстинаКаждое = Истина ЭКСПОРТ
---
ЕСЛИ ИстинаЛюбое
ИЛИ Условие_а
ИЛИ Условие_б

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

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

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

Если вам так уж хочется какого то другого опроса, то создайте его сами и укажите здесь ссылку.
113. grumagargler 723 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 7136 16.11.17 14:37 Сейчас в теме
(111) Интересно. Но непонятно, почему там не прибавляют очки сложности за скобки в выражении. Может быть я не нашел просто?
114. karimov_m 25.12.17 19:17 Сейчас в теме
А еще есть Польская нотация (префиксная запись), там вообще все без скобок)) Но вот, мягко говоря, это никак не добавляет к читаемости кода=)
115. ildarovich 7850 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 91 26.12.17 15:19 Сейчас в теме
(116) Вот только вычислений будет в четыре раза больше. В некоторых случаях.
118. karimov_m 26.12.17 15:26 Сейчас в теме
(117) ну тут речь о булевой алгебре т.е. суть битовые операции, т.е. суть современные процессоры сжуют этот код (при должной компиляции) за пару тактов. Это если на С например такое написать... Но ок, речь о стековой машинке 1С, с виртуальной машинкой внутри, но даже при таких жестких расходных ресурсах - скорость вычисления такого блока - микросекунды. Но да, если вы пишите ПО для спутникового оборудования на 1С (что нереально конечно-же=), будет не комфортно))
Для бизнес задач и вычислений - фактически - не имеет значения вообще как будет записаны такие выражения - тут речь строго о стилистике. Т.к. внутри 1С, код будет приведен к более менее одному составу команд и логических прыжков на подпрограммы
sml; CSiER; +2 Ответить
119. ditp 91 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 7136 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 167 20.04.18 23:08 Сейчас в теме
На мой взгляд, все эти логические построения из булевой алгебры делают понятным код только тому кто его написал, если автор предполагает шарить код с другими программистами, лучше сделать код нагляднее отступами, либо вообще изменить условие чтобы код стал понятным, например вместо чисел подставить именованные константы, или объединить группу условий под одним логическим выражением
ПонятноеИзКонтекстаУсловие = (НомерИзменяемойКолонки = "4") Или (НомерИзменяемойКолонки = "5")
//тем самым само условие упрощается и будет читаться как предложение
Если  ПонятноеИзКонтекстаУсловие  Или ВтороеПонятноеИзКонтекстаУсловие Тогда
126. tormozit 7136 20.04.18 23:21 Сейчас в теме
(125)
все эти логические построения из булевой алгебры делают понятным код только тому кто его написал
Я описал четкую методику и потому все освоившее ее будут записывать выбранные выражения в единой системе. И раз уж каждый из них будет понимать записанное собой выражение в предложенном виде, то и другие будут понимать то же выражение, т.к. они бы смогли записать его ровно в том же виде.
evgen7938; +1 Ответить
127. evgen7938 14 13.01.19 11:17 Сейчас в теме
(126) Самый крутой 1С-ник из всех мне известных описал методику, изложил факты и свои соображения по этому поводу.
Хотите - пользуйтесь, не хотите - не пользуйтесь.

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

Вот это так и не уловил, для меня наглядности больше не стало, может чего не понимаю. В остальном очень даже хорошо, буду использовать.
129. user1253329 23.11.19 08:43 Сейчас в теме
Хорошая статья, за абзац с шаблонами отдельное спасибо
130. tormozit 7136 23.11.19 08:55 Сейчас в теме
Восстановил удаленные кем/чем то фрагменты "<?>" в шаблонах
131. Zurfik 16.07.20 12:07 Сейчас в теме
Мне вот так больше всего нравится.
Операнд1 = НомерИзменяемойКолонки = "4" ИЛИ НомерИзменяемойКолонки = "5" ИЛИ НомерИзменяемойКолонки = "7";
Операнд2 = НомерИзменяемойКолонки = "8" И ГруппаРасчета = мИдГруппы7;
ПодходящийНомерКолонки = Операнд1 ИЛИ Операнд2;
Если ПодходящийНомерКолонки Тогда
    Расчет(ГруппаРасчета);
КонецЕсли; 
 

Ваш вариант мне как новичку тяжело воспринимать на ходу.
133. пользователь 27.07.20 14:58
Сообщение было скрыто модератором.
...
134. MikhailDr 07.06.22 07:26 Сейчас в теме
Года два уже использую эту конструкцию, и это действительно удобно.
135. CSiER 35 21.06.23 05:38 Сейчас в теме
(115), сложные выражения удобно упрощать/приводить к днф с помощью wolframalpha.
136. LosevI 29.06.23 03:14 Сейчас в теме
Я в своем коде использую по своей сути то же форматирование, как предлагает автор, за отличием лишь в отсутствии лишних булевых литералов.

Если 1 условие, то пишу
Если Условие1 Тогда
ТелоВетки();
КонецЕсли;

Если условия 2 и более, то пишу
Если
Условие1
И Условие2
Тогда
ТелоВетки();
КонецЕсли;


Считаю нечитаемым именно подход с переносами по границе строки (120 символов) вида:
Если Условие1 И Условие2
И Условие3 Тогда
ТелоВетки();
КонецЕсли;

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

В комментариях большинство о производительности не думают. "Ленивые вычисления" операторов "И" обязывают не разбивать узлы дерева на отдельные переменные. Что касается лишних литералов, я считаю, что единственная причина их использования автором кроется в "удобнее комментировать строчку условия при отладке, так я смогу закомментировать 1ую строчку". И вот я лично из-за подобной причины нагружать (пусть и очень незначительно, но это накапливается в крупных конфигурациях) продуктовый код считаю резко и решительно недопустимым. Статья написана в 2012 году, а автор в основном разрабатывает тулзы под обычное приложение, поэтому тут скидку сделать можно.

Но всем, кто, возможно, прочитает этот комментарий в 2023 я советую эти литералы не использовать, если вы конечно не работаете в дыре, где всем все равно. А если не работаете в дыре, то ваш лид в любом случае подобное должен завернуть на переделку. Мне по долгу службы во франче удалось повидать не мало сторонних продуктовых модулей и конфигураций (я имею в виду не от фирмы 1С), так вот я сделал наблюдение, что подобное оформление выражений со стартующими литералами обычно используют разработчики, чей продукт лагает как последняя ****. Конечно, не из-за литерала. А из-за стиля мысли, который распространяется на неоптимальную разработку и оформление всего остального, включая тяжелые запросы и их исполнение. И вообще, если вам постоянно приходится писать огромные условия из 3+ нодов, то вы что-то не так разрабатываете с точки зрения архитектуры.
139. tormozit 7136 17.02.24 08:05 Сейчас в теме
(136)
Само обоснование "резко и решительно недопустимым" путем "очень незначительно, но это накапливается в крупных конфигурациях" вызывает недоумение, т.к. утверждение очень категоричное, а обоснование очень слабое.
Не на том ты экономишь. Поверь мне я в любой твоей конфигурации найду столько мест, которые можно ускорить со значительно бОльшим эффектом, что ты забудешь об этих микро затратах.

Спасибо за скидку на обычное приложение. Но я разрабатываю уже давно под управляемое приложение. Обычное приложение я поддерживаю в ИР из-за его уникальных возможностей и наличии большого спроса на инструменты под него. Но в ИР есть и полная поддержка управляемого приложения - хорошо бы знать такое в 2023г. Но наверное нужно сделать скидку на твой небольшой опыт работы, который видимо начался с эры управляемого приложения.
141. sml 41 22.02.24 11:50 Сейчас в теме
(136) Минусанул, поскольку код 1С используется не только в конфигурациях, но и в правилах обмена КД 2. Там этих условий в ПКО, особенно для бухгалтерских конфигураций тьма тьмущая. А потому подход Ваш с прокрустовым ложем не конструктивен
140. tormozit 7136 17.02.24 08:09 Сейчас в теме
В ИР появилась команда форматирования кода встроенного языка с поддержкой этой методики https://www.hostedredmine.com/issues/976478
Оставьте свое сообщение