Т.е.дублирование 4-х не самых простых строчек кода в соседних условиях тебя не напрягает?
Новые правила "Одинаковые условия в последовательности вида Если (....) ИначеЕсли (....) ИначеЕсли (....)" и "Одинаковый код во взаимоисключаемых ветках ветвления кода"
Вызов одной и той же функции - не напрягает.
Обычный switch же в примере. Для части веток необходимо одно и тоже действие из группы действий. Как альтернатива вижу только увеличение числа ветвлений, а это решение не лучше.
Поэтому и спросил про ваш вариант рефакторинга.
Кстати, интересно, почему сработало 5 раз, а не 6. Вроде в ветке с ИмяКласса = "ЖурналыДокументов"
тоже есть стандартные реквизиты.
Да, речь про этот скриншот. Хотя, я согласен с @Infactum, что вызовы методов не должны считаться копипастой.
два, три, десять, двадцать одинаковых дублей вы не считаете проблемой ?
копипаст в коде - зло практически всегда, и не нужно его оправдывать.
В коде, для которого сработало данное правило, есть хороший шанс уменьшить копипаст и выделить одинаковую функциональность, упростив код.
А упрощение кода поможет увидеть новые закономерности и еще улучшить код.
И это работает точно, и в разных языках
Такая статическая проверка очень полезна во многих языках, в т.ч. и в 1С.
сюда же 2, 3, 10, 20 одинаковых вызовов методов.
Никита выше уже писал про такое
Пересмотрел код повнимательнее.
Там именно 5 вхождений, все верно.
2 строки дублируются.
В других строках ветвления или есть доп.вызов или одной строки не хватает.
Возможно, у тебя более новая версия БСП, я смотрел на код СППР
Так как предлагаете отрефакторить? Я согласен с @Infactum , здесь проще/читабельней/без копипаста вызова вряд ли получиться. И вряд ли это прям “мажорная” ошибка
Я бы условия соединил и сделал единый блок обработки.
Например,
- через “Или”
Если Условие1 Или Условие2 Тогда
БывшийДубльКода();
КонецЕсли;
- либо сначала перенести сложные условия в нормальную переменную внутри отдельного “Если”
Иначе
ТаблицыРавны = ...;
ОтменилиРасчет = ...;
Если ТаблицыРавны Или ОтменилиРасчет Тогда
БывшийДубльКода();
КонецЕсли;
КонецЕсли;
Второй вариант, конечно, более опасный с точки зрения производительности, т.к. в текущем коде второе условие могло вообще не анализироваться для части кейсов.
Но с точки зрения читабельности 2-й чаще более понятен, чем 1-й.
Можно еще так заморочиться (для производительности)
Иначе
ОтменилиРасчет = Ложь;
ТаблицыРавны = ...;
Если Не ТаблицыРавны Тогда
ОтменилиРасчет = ...;
КонецЕсли;
Если ТаблицыРавны Или ОтменилиРасчет Тогда
БывшийДубльКода();
КонецЕсли;
КонецЕсли;
Я вам очередной раз напомню, хотя это имеет опосредованное отношение к данному правилу, но имеет.
МЫ уже много раз прорабатывали, а @JohnyDeath должен точно помнить как рефакторить код аналогичный switch. Это называется регистр правил, если кто забыл.
Это отсылка к старой гвардии времен 1С.ProClub
- Подсистема Константина https://www.33lab.ru/regpr.html
- Концептуальные наработки ДМ (Дмитрия Малюгина) Регистры правил - вики Кинта
Поэтому когда мне говорят что свитч не рефакторится это совершенно не так.
Как мы помним длинный свитч и длинный регистр правил в памяти и в стеке будет лежать по разному и скорость работы на больших условиях будет склоняться в сторону регистра правил.
P.S. Я кстати не помню а сколько у нас по стандарту разрешено количество elseif
блоков
P.S. Я кстати не помню а сколько у нас по стандарту разрешено количество elseif блоков
Не видел ограничений, главное не пытаться его создать ибо все конфы жестко покраснеют . Банальный пример: метод опредения типа метаданных по строке.
Для нас в 1С фактически подходят
- извлечение метода
- перемещение метода
и все
И еще
- замена параметра набором специализированных методов.
Только пока регистров правил так и не видно нигде, кроме как у этих двух товарищей (
У меня был и на 77, и на 8, но перестал юзать и перешел на вариант от Кости.
Даже автотесты написал в свое время на реализацию регистров правил - вы меня знаете
Благодаря этому регистры правил от Константина могу юзать бесплатно!