vbondarevsky / Connector

Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
Apache License 2.0
638 stars 207 forks source link

Рефакторинг функций `ОбъединитьПараметрыАутентификации`, `ОбъединитьЗаголовки`, `ОбъединитьПараметрыЗапроса` #87

Closed slaxxals closed 2 years ago

slaxxals commented 3 years ago

Следующие функции выполняют одну и ту же работу - возвращают объединение переданных коллекций значений (Структура или Соответствие).

Функция ОбъединитьПараметрыАутентификации(ГлавныйИсточник, ДополнительныйИсточник)

    ПараметрыАутентификации = Новый Структура;
    Если ТипЗнч(ГлавныйИсточник) = Тип("Структура") Тогда
        Для Каждого Параметр Из ГлавныйИсточник Цикл
            ПараметрыАутентификации.Вставить(Параметр.Ключ, Параметр.Значение);
        КонецЦикла;
    КонецЕсли;
    Если ТипЗнч(ДополнительныйИсточник) = Тип("Структура") Тогда
        Для Каждого Параметр Из ДополнительныйИсточник Цикл
            Если Не ПараметрыАутентификации.Свойство(Параметр) Тогда
                ПараметрыАутентификации.Вставить(Параметр.Ключ, Параметр.Значение);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    Возврат ПараметрыАутентификации;

КонецФункции

Функция ОбъединитьЗаголовки(ГлавныйИсточник, ДополнительныйИсточник)

    Заголовки = Новый Соответствие;
    Для Каждого Заголовок Из ГлавныйИсточник Цикл
        Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
    КонецЦикла;
    Для Каждого Заголовок Из ДополнительныйИсточник Цикл
        Если Заголовки.Получить(Заголовок.Ключ) = Неопределено Тогда
            Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
        КонецЕсли;
    КонецЦикла;

    Возврат Заголовки;

КонецФункции

Функция ОбъединитьПараметрыЗапроса(ГлавныйИсточник, ДополнительныйИсточник)

    ПараметрыЗапроса = Новый Соответствие;
    Если ТипЗнч(ГлавныйИсточник) = Тип("Структура") ИЛИ ТипЗнч(ГлавныйИсточник) = Тип("Соответствие") Тогда
        Для Каждого Параметр Из ГлавныйИсточник Цикл
            ПараметрыЗапроса.Вставить(Параметр.Ключ, Параметр.Значение);
        КонецЦикла;
    КонецЕсли;
    Если ТипЗнч(ДополнительныйИсточник) = Тип("Структура") ИЛИ ТипЗнч(ДополнительныйИсточник) = Тип("Соответствие") Тогда
        Для Каждого Параметр Из ДополнительныйИсточник Цикл
            Если ПараметрыЗапроса.Получить(Параметр) = Неопределено Тогда
                ПараметрыЗапроса.Вставить(Параметр.Ключ, Параметр.Значение);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    Возврат ПараметрыЗапроса;

КонецФункции

Предлагаю вызовы этих функций заменить на одну новую Объединить:

Функция Объединить( ГлавныйИсточник, ДополнительныйИсточник, РезультатКакСтруктура = Ложь )

    ДопустимыеТипы = Новый ОписаниеТипов( "Структура,Соответствие" );

    Результат = ? ( РезультатКакСтруктура, Новый Структура, Новый Соответствие );

    Скопировать( Результат, ГлавныйИсточник, ДопустимыеТипы );

    Дополнить( Результат, ДополнительныйИсточник, ДопустимыеТипы );

    Возврат( Результат );

КонецФункции // Объединить

Процедура Скопировать( Приемник, Источник, ДопустимыеТипы )

    Если Не ДопустимыеТипы.СодержитТип( ТипЗнч( Приемник ) )
        Или Приемник = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Для Каждого ЭлементИсточник Из Источник Цикл
        Приемник.Вставить(ЭлементИсточник.Ключ, ЭлементИсточник.Значение);
    КонецЦикла;

КонецПроцедуры // Скопировать

Процедура Дополнить( Приемник, Источник, ДопустимыеТипы )

    ИсточникТип = ТипЗнч( Источник );

    Если Не ДопустимыеТипы.СодержитТип( ИсточникТип )
        Или Источник = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Для Каждого ЭлементДопИсточника Из Источник Цикл
        ПараметрНайден = Ложь;

        Если ИсточникТип = Тип("Соответствие") Тогда
            ПараметрНайден = Приемник.Получить(ЭлементДопИсточника) <> Неопределено;
        КонецЕсли;

        Если ИсточникТип = Тип("Структура") Тогда
            ПараметрНайден = Приемник.Свойство(ЭлементДопИсточника);
        КонецЕсли;

        Если Не ПараметрНайден Тогда
            Приемник.Вставить(ЭлементДопИсточника.Ключ, ЭлементДопИсточника.Значение);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры // Дополнить
slaxxals commented 3 years ago

Кроме этого, можно также упростить и эти функции ДополнитьПараметрыПреобразованияJSON, ДополнитьПараметрыЗаписиJSON.

Например, вместо:

Функция ДополнитьПараметрыПреобразованияJSON(ПараметрыПреобразования)

    ПараметрыПреобразованияJSON = ПараметрыПреобразованияJSONПоУмолчанию();
    Если ЗначениеЗаполнено(ПараметрыПреобразования) Тогда
        Для Каждого Параметр Из ПараметрыПреобразования Цикл
            Если ПараметрыПреобразованияJSON.Свойство(Параметр.Ключ) Тогда
                ПараметрыПреобразованияJSON.Вставить(Параметр.Ключ, Параметр.Значение);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    Возврат ПараметрыПреобразованияJSON;

КонецФункции

получить следующее:

Функция ДополнитьПараметрыПреобразованияJSON(ПараметрыПреобразования)

    ПараметрыПреобразованияJSON = ПараметрыПреобразованияJSONПоУмолчанию();

    Дополнить( ПараметрыПреобразованияJSON, ПараметрыПреобразования, Новый ОписаниеТипов( "Структура" ) );

    Возврат ПараметрыПреобразованияJSON;

КонецФункции
zeegin commented 2 years ago

Мне не нравится РезультатКакСтруктура - это плохой запах кода. Лучше избегать флажковый стиль ветвления в коде.

// ОбъединитьПараметрыАутентификации(ГлавныйИсточник, ДополнительныйИсточник)
// -> Объединить(ГлавныйИсточник, ДополнительныйИсточник)
//
// ОбъединитьЗаголовки(ГлавныйИсточник, ДополнительныйИсточник)
// -> Объединить(ГлавныйИсточник, ДополнительныйИсточник)
//
// ОбъединитьПараметрыЗапроса(ГлавныйИсточник, ДополнительныйИсточник)
// -> Объединить(ГлавныйИсточник, ДополнительныйИсточник)
//
// ДополнитьПараметрыПреобразованияJSON(ПараметрыПреобразования)
// -> Объединить(ПараметрыПреобразованияJSONПоУмолчанию(), ПараметрыПреобразования)
//

Функция Объединить(ГлавныйИсточник, ДополнительныйИсточник)

    Результат = Скопировать(ГлавныйИсточник);
    Дополнить(Результат, ДополнительныйИсточник);
    Возврат Результат;

КонецФункции

Функция Скопировать(Источник)

    Результат = Новый(ТипЗнч(Источник));

    Для Каждого ЭлементИсточник Из Источник Цикл
        Результат.Вставить(ЭлементИсточник.Ключ, ЭлементИсточник.Значение);
    КонецЦикла;

        Возврат Результат;

КонецФункции

Процедура Дополнить(Приемник, Источник)

    Если Источник = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Для Каждого ЭлементДопИсточника Из Источник Цикл
        ПараметрНайден = Ложь;

        Если ИсточникТип = Тип("Соответствие") Тогда
            ПараметрНайден = Приемник.Получить(ЭлементДопИсточника) <> Неопределено;
        КонецЕсли;

        Если ИсточникТип = Тип("Структура") Тогда
            ПараметрНайден = Приемник.Свойство(ЭлементДопИсточника);
        КонецЕсли;

        Если Не ПараметрНайден Тогда
            Приемник.Вставить(ЭлементДопИсточника.Ключ, ЭлементДопИсточника.Значение);
        КонецЕсли;
    КонецЦикла;

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