Перейти к содержанию

BSL035 - Повторное использование строкового литерала

Кратко

Повторное использование строкового литерала

Идентификаторы

Поле Значение
Код правила BSL035
Совместимый псевдоним DuplicateStringLiteral
Серьёзность INFORMATION
Без конфигурации Да
BSLLS JSON, режим ON без переопределений Да
Флаг реестра implemented Да
Теги convention, readability

Флаг implemented отражает реестр и не подтверждает проверенное совпадение с BSLLS.

Поведение

  • Публичный идентификатор BSL035 и псевдоним DuplicateStringLiteral стабильны.
  • Правило сообщает о случаях, описанных на этой странице.
  • Подавления и проектная конфигурация применяются до публикации результата.
  • Для выполнения правила не требуется внешний анализатор или сетевой доступ.

Настройка и подавление

Код BSL### - основной стабильный идентификатор. Совместимый псевдоним принимается в select, ignore и совместимых блоковых комментариях.

[tool.onec-hbk-bsl]
select = ["BSL035"]
ignore = ["DuplicateStringLiteral"]

Все три семейства подавлений работают для текущей строки и диапазона. Если открывающий комментарий стоит после кода, он действует только на эту строку. Используйте любой один вариант:

  • noqa:
Значение = "пример";  // noqa: BSL035
  • bsl-disable (совместимый вариант):
Значение = "пример";  // bsl-disable: BSL035
  • совместимый BSLLS-вариант:
Значение = "пример";  // BSLLS:DuplicateStringLiteral-off

Если тот же открывающий комментарий стоит на отдельной строке, он начинает диапазон. Закройте его парным маркером того же семейства:

// noqa: BSL035
// код без этой диагностики
// noqa-enable: BSL035

// bsl-disable: BSL035
// код без этой диагностики
// bsl-enable: BSL035

// BSLLS:DuplicateStringLiteral-off
// код без этой диагностики
// BSLLS:DuplicateStringLiteral-on

Чтобы отключить правило до конца файла, не добавляйте закрывающий noqa-enable, bsl-enable или BSLLS:…-on.

Открывающий и закрывающий маркеры должны принадлежать одному семейству.

Описание диагностики

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

Особенности реализации диагностики

  • Диагностика с настройками по умолчанию не учитывает регистр символов литерала, т.о. считаются одинаковыми строки АААА и АааА.
  • Нельзя указать минимальное значение анализируемого литерала меньше, чем значение по умолчанию. Это обусловлено тем, что часто используются служебные литералы, которые будут сильно фонить. Например: пустая строка "", числа-селекторы "1", "0" и т.д.
  • Нельзя уменьшить допустимое количество повторов использования меньше 1, т.к. это не имеет практического смысла.

Примеры

Плохой код

Процедура Тест(Параметр)
    Результат = "Значение";
    Если Параметр = "ВРег" Тогда
        Результат = Результат + ВРег("Значение");
    Иначе
        Результат = Результат + HРег("Значение");
    КонецЕсли;
КонецПроцедуры

Исправленный вариант

Процедура Тест(Параметр)
    Результат = "Значение";
    Если Параметр = "ВРег" Тогда
        Результат = Результат + ВРег(Результат);
    Иначе
        Результат = Результат + HРег(Результат);
    КонецЕсли;
КонецПроцедуры

Плохой код

Процедура Тест2(Параметр)
    Если Параметр = "ВРег" Тогда
        Результат = Результат + ВРег("Значение");
    Иначе
        Результат = Результат + HРег("Значение");
    КонецЕсли;
КонецПроцедуры

Процедура Тест3(Параметр)
    Если Параметр = "СОКРЛП" Тогда
        Результат = Результат + СокрЛП("Значение");
    КонецЕсли;
КонецПроцедуры

Исправленный вариант

Процедура Тест2(Параметр)
    Если Параметр = "ВРег" Тогда
        Результат = Результат + ВРег(СтроковоеЗначение());
    Иначе
        Результат = Результат + HРег(СтроковоеЗначение());
    КонецЕсли;
КонецПроцедуры

Процедура Тест3(Параметр)
    Если Параметр = "СОКРЛП" Тогда
        Результат = Результат + СокрЛП(СтроковоеЗначение());
    КонецЕсли;
КонецПроцедуры

Функция СтроковоеЗначение()
    Возврат "Значение";
КонецПроцедуры

Источники