Повторное использование строкового литерала (DuplicateStringLiteral)¶
Тип | Поддерживаются языки |
Важность | Включена по умолчанию |
Время на исправление (мин) |
Теги |
---|---|---|---|---|---|
Дефект кода |
BSL OS |
Незначительный |
Да |
1 |
badpractice |
Параметры¶
Имя | Тип | Описание | Значение по умолчанию |
---|---|---|---|
allowedNumberCopies |
Целое |
Допустимое количество повторов использования строкового литерала |
2 |
analyzeFile |
Булево |
Анализировать весь файл целиком |
false |
caseSensitive |
Булево |
Учитывать регистр |
false |
minTextLength |
Целое |
Минимальная длина строкового литерала (с кавычками) |
5 |
Описание диагностики¶
Многократное использование одинаковых строковых литералов в одном модуле или методе является плохим тоном, т.к. - оно может приводить к сложностям при дальнейшем сопровождении, когда необходимо изменить значение и высока вероятность пропустить одно из повторений - оно может быть следствием "копипасты", т.е. разработчик забыл изменить, после копирования похожего блока кода.
Особенности реализации диагностики¶
- Диагностика с настройками по умолчанию не учитывает регистр символов литерала, т.о. считаются одинаковыми строки
АААА
иАааА
. - Нельзя указать минимальное значение анализируемого литерала меньше, чем значение по умолчанию. Это обусловлено тем, что часто используются служебные литералы, которые будут сильно фонить. Например: пустая строка "", числа-селекторы "1", "0" и т.д.
- Нельзя уменьшить допустимое количество повторов использования меньше 1, т.к. это не имеет практического смысла.
Примеры¶
Плохой код
Процедура Тест(Параметр)
Результат = "Значение";
Если Параметр = "ВРег" Тогда
Результат = Результат + ВРег("Значение");
Иначе
Результат = Результат + HРег("Значение");
КонецЕсли;
КонецПроцедуры
Исправленный вариант
Процедура Тест(Параметр)
Результат = "Значение";
Если Параметр = "ВРег" Тогда
Результат = Результат + ВРег(Результат);
Иначе
Результат = Результат + HРег(Результат);
КонецЕсли;
КонецПроцедуры
Плохой код
Процедура Тест2(Параметр)
Если Параметр = "ВРег" Тогда
Результат = Результат + ВРег("Значение");
Иначе
Результат = Результат + HРег("Значение");
КонецЕсли;
КонецПроцедуры
Процедура Тест3(Параметр)
Если Параметр = "СОКРЛП" Тогда
Результат = Результат + СокрЛП("Значение");
КонецЕсли;
КонецПроцедуры
Исправленный вариант
Процедура Тест2(Параметр)
Если Параметр = "ВРег" Тогда
Результат = Результат + ВРег(СтроковоеЗначение());
Иначе
Результат = Результат + HРег(СтроковоеЗначение());
КонецЕсли;
КонецПроцедуры
Процедура Тест3(Параметр)
Если Параметр = "СОКРЛП" Тогда
Результат = Результат + СокрЛП(СтроковоеЗначение());
КонецЕсли;
КонецПроцедуры
Функция СтроковоеЗначение()
Возврат "Значение";
КонецПроцедуры
Источники¶
Сниппеты¶
Экранирование кода¶
// BSLLS:DuplicateStringLiteral-off
// BSLLS:DuplicateStringLiteral-on
Параметр конфигурационного файла¶
"DuplicateStringLiteral": {
"allowedNumberCopies": 2,
"analyzeFile": false,
"caseSensitive": false,
"minTextLength": 5
}