#std440¶
Использование дублирующего кода¶
1.¶
Дублирование кода — это копирование существующих фрагментов, процедур или функций без изменений при разработке нового функционала, когда логика должна оставаться одинаковой.
Такой подход усложняет сопровождение:
- в копию попадают исходные ошибки;
- при исправлении легко пропустить часть вхождений;
- растут затраты на поддержку;
- ухудшается читаемость структуры программы.
Частая причина дублирования — исходный код недоступен из места нового использования (например, код находится в модуле формы, а нужен в другой форме).
Старайтесь избегать дублирования и по возможности перерабатывайте существующий код. Обычно это означает вынос повторно используемой логики из модулей объектов и форм в общие модули.
2.¶
Дублирование допустимо, если в будущем ожидается заметное расхождение логики в двух вариантах кода.
Пример¶
В функции СообщитьПользователю() общего модуля ОбщегоНазначенияКлиентСервер понадобилась дополнительная обработка входных параметров на сервере.
Неправильно
Использовать #std439: инструкции препроцессора для разделения серверной и клиентской логики:
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщенияПользователю;
Сообщение.Поле = Поле;
ЭтоОбъект = Ложь;
#Если Не ТонкийКлиент И Не ВебКлиент Тогда
Если КлючДанных <> Неопределено
И XMLТипЗнч(КлючДанных) <> Неопределено Тогда
ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
КонецЕсли;
#КонецЕсли
Если ЭтоОбъект Тогда
Сообщение.УстановитьДанные(КлючДанных);
Иначе
Сообщение.КлючДанных = КлючДанных;
КонецЕсли;
Сообщение.Сообщить();
Отказ = Истина;
КонецПроцедуры
Правильно
Разделить процедуру на серверную и клиентскую, а общую часть оставить в отдельном клиент-серверном модуле.
1) Серверная процедура:
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт
ЭтоОбъект = Ложь;
Если КлючДанных <> Неопределено
И XMLТипЗнч(КлючДанных) <> Неопределено Тогда
ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
КонецЕсли;
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ, ЭтоОбъект);
КонецПроцедуры
2) Клиентская процедура:
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт
ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ);
КонецПроцедуры
3) Общая служебная реализация:
Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных, Знач Поле, Отказ = Ложь, ЭтоОбъект = Ложь) Экспорт
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ТекстСообщенияПользователю;
Сообщение.Поле = Поле;
Если ЭтоОбъект Тогда
Сообщение.УстановитьДанные(КлючДанных);
Иначе
Сообщение.КлючДанных = КлючДанных;
КонецЕсли;
Сообщение.Сообщить();
Отказ = Истина;
КонецПроцедуры