В мире разработчиков ходят легенды, что рабочее тело каждого метода, за редким исключением, можно уместить в один экран. Мало кто пробовал, еще у меньшего количества это получалось. У единиц - сделать при этом методы ЧИТАЕМЫМИ. Это так, чтобы человеку не требовался весь жизненный опыт всех разработчиков, приложивших руку к методу, чтобы в нём разобраться.
Обеспечивается это много чем - от хороших имён (переменных - это когда понятно, что в ней хранится, и методов - это когда понятно, что выполняется, а главное, контракт того, что выполняется ТОЛЬКО ЭТО) до контроля цикломатической сложности (а вы, кстати, знали, что это - минимальное количество тестов, необходимых для покрытия всего пути?)
Но сегодня про одну из самых бесячих, лично для меня, вещей - if-каскады. Это когда через бесконечную переборку условий выполняются какие-то действия.
Думаю, каждый встречал хоть раз в жизни что-то вот такое:
Процедура ВажныеДействияСВажнойСущностью(ВажнаяСущность)
Если ВажнаяСущность = ПервоеЗначение Тогда
//какой-то
//исполняемый
//код
ИначеЕсли ВажнаяСущность = ВтороеЗначение Тогда
//ещё
//исполняемый
//код
ИначеЕсли ВажнаяСущность = ТретьеЗначение Тогда
//дохрена
//исполняемого
//кода
//еще
//очень
//дохрена
//переборов
//важных
//значений
Иначе
//а может и не быть
КонецЕсли;
КонецПроцедуры
Делать так - ебанно❌!
А вот так - хорошо👍
Процедура ВажныеДействияСВажнойСущностью(ВажнаяСущность)
ТекстИсключения = ТекстВажныеДействияНеОписаны();
ИмяМетода = ИсполняемыеМетоды()[ВажнаяСущность];
Если Не ЗначениеЗаполнено(ИмяМетода) Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ПараметрыМетода = ПараметрыДляМетодов(ВажнаяСущность)[ИмяМетода];
Если ПараметрыМетода = Неопределено Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
КонецПроцедуры
Функция ИсполняемыеМетоды()
Результат = Новый Соответствие;
Результат.Вставить(ПервоеЗначение, "ИмяПервогоМетода");
Результат.Вставить(ВтороеЗначение, "ИмяВторогоМетода");
//еще сколько надо пар КлючЗначение
Возврат Результат;
КонецФункции
Функция ПараметрыДляМетодов(ВажнаяСущность)
Результат = Новый Соответствие;
Результат.Вставить("ИмяПервогоМетода", ПараметрыПервогоМетода(ВажнаяСущность));
//еще сколько надо пар КлючЗначение
Возврат Результат;
КонецФункции
Процедура ИмяПервогоМетода(Параметры) Экспорт
//какой-то исполняемый код
КонецПроцедуры
Процедура ИмяВторогоМетода(Параметры) Экспорт
//какой-то исполняемый код
КонецПроцедуры
Функция ПараметрыПервогоМетода(ВажнаяСущность)
Результат = Новый Структура;
Результат.Вставить("Параметр1", ВажнаяСущность.Свойство1);
Результат.Вставить("Параметр2", ВажнаяСущность.Свойство2);
Возврат Результат;
КонецФункции
Функция ТекстВажныеДействияНеОписаны()
Возврат НСтр("ru = 'Ваш разработчик не предусмотрел выполнение сценария.
|Свяжитесь с его начальником, он даст ему просраться'");
КонецФункции
Результат этого подхода
➡️повышается читаемость метода
➡️упрощается расширение
➡️упрощается изменение
➡️появляется возможность разделить ответственность (если
ВажнаяСущность может быть различными объектами, то перенести исполняемые методы в соответствующие модули)
ОбщегоНазначения.ВыполнитьМетодКонфигурации - это обёртка безопасного выполнения кода из БСПОбщегоНазначения.ВыполнитьМетодОбъекта - это вариант, если требуется выполнение метода, описанного в модуле конкретного объектаОтдельная функция
ПараметрыДляМетодов() - это усложнение на случай, если Вам требуются разные параметры для каждого случая, чаще это не так и можно обойтись без неё.Вариант полезного усложнения функционала -добавить место хранения (в 1С это может быть, к примеру, регистр сведений), где методы будут указаны с определенными ключами. Может понадобиться, если выбираемый метод зависит не только от значения
ВажнойСущности, но и еще от лунных циклов заказчика.#медвежийкодстайл