#std440

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

1.

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

Такой подход усложняет сопровождение:

  • в копию попадают исходные ошибки;
  • при исправлении легко пропустить часть вхождений;
  • растут затраты на поддержку;
  • ухудшается читаемость структуры программы.

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

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

2.

Дублирование допустимо, если в будущем ожидается заметное расхождение логики в двух вариантах кода.

Пример

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

Неправильно

Использовать #std439: инструкции препроцессора для разделения серверной и клиентской логики:

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

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщенияПользователю;
    Сообщение.Поле = Поле;

    ЭтоОбъект = Ложь;

#Если Не ТонкийКлиент И Не ВебКлиент Тогда
    Если КлючДанных <> Неопределено
        И XMLТипЗнч(КлючДанных) <> Неопределено Тогда

        ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
        ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
    КонецЕсли;
#КонецЕсли

    Если ЭтоОбъект Тогда
        Сообщение.УстановитьДанные(КлючДанных);
    Иначе
        Сообщение.КлючДанных = КлючДанных;
    КонецЕсли;

    Сообщение.Сообщить();
    Отказ = Истина;

КонецПроцедуры

Правильно

Разделить процедуру на серверную и клиентскую, а общую часть оставить в отдельном клиент-серверном модуле.

1) Серверная процедура:

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

    ЭтоОбъект = Ложь;
    Если КлючДанных <> Неопределено
      И XMLТипЗнч(КлючДанных) <> Неопределено Тогда

        ТипЗначенияСтрокой = XMLТипЗнч(КлючДанных).ИмяТипа;
        ЭтоОбъект = СтрНайти(ТипЗначенияСтрокой, "Object.") > 0;
    КонецЕсли;

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

КонецПроцедуры

2) Клиентская процедура:

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

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

КонецПроцедуры

3) Общая служебная реализация:

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

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстСообщенияПользователю;
    Сообщение.Поле = Поле;

    Если ЭтоОбъект Тогда
        Сообщение.УстановитьДанные(КлючДанных);
    Иначе
        Сообщение.КлючДанных = КлючДанных;
    КонецЕсли;

    Сообщение.Сообщить();
    Отказ = Истина;

КонецПроцедуры
См. также
Проверки

#acc:1343 #acc:1344

Источник

https://its.1c.ru/db/v8std#content:440