Новые правила "Одинаковые условия в последовательности вида Если (....) ИначеЕсли (....) ИначеЕсли (....)" и "Одинаковый код во взаимоисключаемых ветках ветвления кода"

sonar-bsl-plugin

#21

Т.е.дублирование 4-х не самых простых строчек кода в соседних условиях тебя не напрягает?


#22

Вызов одной и той же функции - не напрягает.
Обычный switch же в примере. Для части веток необходимо одно и тоже действие из группы действий. Как альтернатива вижу только увеличение числа ветвлений, а это решение не лучше.
Поэтому и спросил про ваш вариант рефакторинга.


#23

Кстати, интересно, почему сработало 5 раз, а не 6. Вроде в ветке с ИмяКласса = "ЖурналыДокументов" тоже есть стандартные реквизиты.


#24

@Vladislav_Moroz есть и по 6 вхождений :slight_smile:

ты же про этот скриншот, верно? или другой?

image


#25

Да, речь про этот скриншот. Хотя, я согласен с @Infactum, что вызовы методов не должны считаться копипастой.


#26

два, три, десять, двадцать одинаковых дублей вы не считаете проблемой ? :frowning:

копипаст в коде - зло практически всегда, и не нужно его оправдывать.

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

Такая статическая проверка очень полезна во многих языках, в т.ч. и в 1С.


#27

сюда же 2, 3, 10, 20 одинаковых вызовов методов.


#28

Никита выше уже писал про такое


#29

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

Возможно, у тебя более новая версия БСП, я смотрел на код СППР


#30

Так как предлагаете отрефакторить? Я согласен с @Infactum , здесь проще/читабельней/без копипаста вызова вряд ли получиться. И вряд ли это прям “мажорная” ошибка


#31

Я бы условия соединил и сделал единый блок обработки.
Например,

  • через “Или”
  Если Условие1 Или Условие2 Тогда
    БывшийДубльКода();
  КонецЕсли;
  • либо сначала перенести сложные условия в нормальную переменную внутри отдельного “Если”
Иначе
  ТаблицыРавны = ...;
  ОтменилиРасчет = ...;
  Если ТаблицыРавны Или ОтменилиРасчет Тогда
    БывшийДубльКода();
  КонецЕсли;
КонецЕсли;

#32

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

Можно еще так заморочиться (для производительности)

Иначе
  ОтменилиРасчет = Ложь;
  ТаблицыРавны = ...;
  Если Не ТаблицыРавны Тогда 
    ОтменилиРасчет = ...;
  КонецЕсли;
  Если ТаблицыРавны Или ОтменилиРасчет Тогда
    БывшийДубльКода();
  КонецЕсли;
КонецЕсли;

#33

Я вам очередной раз напомню, хотя это имеет опосредованное отношение к данному правилу, но имеет.

МЫ уже много раз прорабатывали, а @JohnyDeath должен точно помнить как рефакторить код аналогичный switch. Это называется регистр правил, если кто забыл.

Это отсылка к старой гвардии времен 1С.ProClub

Поэтому когда мне говорят что свитч не рефакторится это совершенно не так.

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

P.S. Я кстати не помню а сколько у нас по стандарту разрешено количество elseif блоков


#34

P.S. Я кстати не помню а сколько у нас по стандарту разрешено количество elseif блоков

Не видел ограничений, главное не пытаться его создать ибо все конфы жестко покраснеют :slight_smile:. Банальный пример: метод опредения типа метаданных по строке.


#35

Упс


#36

Ну вот же варианты: https://refactoring.guru/ru/smells/switch-statements


#37

Для нас в 1С фактически подходят

  • извлечение метода
  • перемещение метода

и все


#38

И еще

  • замена параметра набором специализированных методов.

#39

Только пока регистров правил так и не видно нигде, кроме как у этих двух товарищей (


#40

У меня был и на 77, и на 8, но перестал юзать и перешел на вариант от Кости.

Даже автотесты написал в свое время на реализацию регистров правил - вы меня знаете :slight_smile:
Благодаря этому регистры правил от Константина могу юзать бесплатно!