Обсудить: Правило - Несколько идущих подряд вложений "Если Условие" без исключений "ИначеЕсли" или "Иначе"

sonar-bsl-plugin

#1

Контекст обсуждения

Пример неверного кода:

Если ИспользуемаяВерсияПлатформыСтаршеИлиРавна("8.3.10") Тогда
    Если ТолькоИзмененные Тогда
        Если ПроверитьВозможностьОбновленияФайловВыгрузки(КаталогВыгрузки, ПутьКФайлуВерсийДляСравнения, ФорматВыгрузки) Тогда

            Какой-то Код();            

        КонецЕсли;
    КонецЕсли;
КонецЕслИ;

более правильно сделать единое условие и одно Если

Если ИспользуемаяВерсияПлатформыСтаршеИлиРавна("8.3.10") 
     И ТолькоИзмененные
     И ПроверитьВозможностьОбновленияФайловВыгрузки(КаталогВыгрузки, ПутьКФайлуВерсийДляСравнения, ФорматВыгрузки) Тогда

            Какой-то Код();            

КонецЕслИ;

Сценарий поведения

  • Правило срабатывает на несколько вложений “Если”
  • Не срабатывает при наличии “ИначеЕсли” или “Иначе”
  • Учесть случай, когда на верхних уровнях нет “ИначеЕсли” или “Иначе”, а на нижних есть
    • Например, для случая ниже правило должно сработать только для первых 2 Если, для последнего Если правило не должно сработать
        Если ИспользуемаяВерсияПлатформыСтаршеИлиРавна("8.3.10") Тогда
            Если ТолькоИзмененные Тогда // здесь работает
                Если ПроверитьВозможностьОбновленияФайловВыгрузки(КаталогВыгрузки, ПутьКФайлуВерсийДляСравнения, ФорматВыгрузки) Тогда // а здесь уже работает

                    Какой-то Код();            

                Иначе
                    Другой Код();            
                КонецЕсли;
            КонецЕсли;
        КонецЕслИ;

PS в стат-анализаторах для разных языков такое правило.
Например, IDEA для Java предлагает такое.

@all Что скажете?


#2

Увидел в свежем пулл-реквесте в библиотеке v8runner и вспомнилось/захотелось :slight_smile:


#3

Полагаю, механизм оценки когнитивной сложности в Сонаре уже сейчас может выявлять ловить такое, не?

А также другие техники по упрощению условий: https://refactoring.guru/ru/refactoring/techniques/simplifying-conditional-expressions


#4

И следом “булево должно быть первым”.


#5

Э-э-э-э, они же все булево!


#6

Оно уже посчитано, а остальные требуют выполнение функции


#7

А что полноценного механизма анализа графа исполнения на предмет его упрощения в сонаре не предусмотрено?


#8

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


#9

Ага, хорошее предложение.

“В условии лучше в начало поставить простую переменную с типом Булево, а не сложные выражения” - потенциальное ускорение выполнения