Использование дублирующего кода

#std440

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

1. Дублированием кода называется способ разработки конфигурации, при котором при создании нового функционала копируются без изменений уже существующие фрагменты кода или целиком процедуры и функции и при этом копируемый функционал по логике приложения должен быть одинаковым.

Дублирование кода создает проблемы для сопровождения разрабатываемой конфигурации:

Дублирование часто возникает из-за невозможности доступа к написанному прежде коду (например, если написанный прежде код размещен в модуле той или иной формы, а его использование востребовано при разработке другой формы).

Следует осторожно относиться к дублированию кода и по возможности стараться его избегать. Основной способ избежать дублирования кода - переработать существующий код. Это позволит вывести процедуры и функции, алгоритмы которых могут быть использованы повторно, из модулей объектов и модулей форм в общие модули.

2. Следует помнить, что дублирование кода оправданно и должно выполняться, если развитие функционала в будущем может привести к значительному расхождению двух вариантов кода.

Пример предотвращения дублирования кода при разработке клиент-серверных функций

В функции СообщитьПользователю общего модуля ОбщегоНазначенияКлиентСервер возникла необходимость особым образом обработать входные параметры при выполнении на сервере.

Неправильно использовать для этого инструкции препроцессора (#Если НЕ ТонкийКлиент И НЕ ВебКлиент):

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

Правильно разделить процедуру на две одноименные в серверном и клиентском модуле с различной реализацией, и для того чтобы избежать дублирования кода, общую реализацию оставить в клиент-серверном общем модуле:

1) серверная функция:

Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт
 
 ЭтоОбъект = Ложь;
 Если КлючДанных <> Неопределено
  И XMLТипЗнч(КлючДанных) <> Неопределено Тогда
  
  ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
  ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
 КонецЕсли;
 
 ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ, ЭтоОбъект);
 
КонецПроцедуры

2) клиентская функция:

Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных = Неопределено, Знач Поле = "", Отказ = Ложь) Экспорт
 
 ОбщегоНазначенияСлужебныйКлиентСервер.СообщитьПользователю(ТекстСообщенияПользователю, КлючДанных, Поле, Отказ);
 
КонецПроцедуры

3) общая служебная клиент-серверная реализация в модуле ОбщегоНазначенияСлужебныйКлиентСервер:

Процедура СообщитьПользователю(Знач ТекстСообщенияПользователю, Знач КлючДанных, Знач Поле, Отказ = Ложь, ЭтоОбъект = Ложь) Экспорт
 
 Сообщение = Новый СообщениеПользователю;
 Сообщение.Текст = ТекстСообщенияПользователю;
 Сообщение.Поле = Поле;
 
 Если ЭтоОбъект Тогда
  Сообщение.УстановитьДанные(КлючДанных);
 Иначе
  Сообщение.КлючДанных = КлючДанных;
 КонецЕсли;
 
 Сообщение.Сообщить();
 Отказ = Истина;
 
КонецПроцедуры

См. также