TGViewer
Bear's Rambles | МЕДВЕДЬ ГОВОРИТ... Bear's Rambles | МЕДВЕДЬ ГОВОРИТ... @bearrambles · 128 subscribers
Post #89 142
Ненавижу, бл🤬ть, каскады

В мире разработчиков ходят легенды, что рабочее тело каждого метода, за редким исключением, можно уместить в один экран. Мало кто пробовал, еще у меньшего количества это получалось. У единиц - сделать при этом методы ЧИТАЕМЫМИ. Это так, чтобы человеку не требовался весь жизненный опыт всех разработчиков, приложивших руку к методу, чтобы в нём разобраться.

Обеспечивается это много чем - от хороших имён (переменных - это когда понятно, что в ней хранится, и методов - это когда понятно, что выполняется, а главное, контракт того, что выполняется ТОЛЬКО ЭТО) до контроля цикломатической сложности (а вы, кстати, знали, что это - минимальное количество тестов, необходимых для покрытия всего пути?)

Но сегодня про одну из самых бесячих, лично для меня, вещей - if-каскады. Это когда через бесконечную переборку условий выполняются какие-то действия.

Думаю, каждый встречал хоть раз в жизни что-то вот такое:
Процедура ВажныеДействияСВажнойСущностью(ВажнаяСущность)
Если ВажнаяСущность = ПервоеЗначение Тогда
//какой-то
//исполняемый
//код
ИначеЕсли ВажнаяСущность = ВтороеЗначение Тогда
//ещё
//исполняемый
//код
ИначеЕсли ВажнаяСущность = ТретьеЗначение Тогда
//дохрена
//исполняемого
//кода
//еще
//очень
//дохрена
//переборов
//важных
//значений
Иначе
//а может и не быть
КонецЕсли;
КонецПроцедуры

Делать так - ебанно❌!

А вот так - хорошо👍
Процедура ВажныеДействияСВажнойСущностью(ВажнаяСущность)
ТекстИсключения = ТекстВажныеДействияНеОписаны();

ИмяМетода = ИсполняемыеМетоды()[ВажнаяСущность];
Если Не ЗначениеЗаполнено(ИмяМетода) Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;

ПараметрыМетода = ПараметрыДляМетодов(ВажнаяСущность)[ИмяМетода];
Если ПараметрыМетода = Неопределено Тогда
ВызватьИсключение ТекстИсключения;
КонецЕсли;

ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяМетода, ПараметрыМетода);
КонецПроцедуры

Функция ИсполняемыеМетоды()
Результат = Новый Соответствие;

Результат.Вставить(ПервоеЗначение, "ИмяПервогоМетода");
Результат.Вставить(ВтороеЗначение, "ИмяВторогоМетода");
//еще сколько надо пар КлючЗначение

Возврат Результат;
КонецФункции

Функция ПараметрыДляМетодов(ВажнаяСущность)
Результат = Новый Соответствие;

Результат.Вставить("ИмяПервогоМетода", ПараметрыПервогоМетода(ВажнаяСущность));
//еще сколько надо пар КлючЗначение

Возврат Результат;
КонецФункции

Процедура ИмяПервогоМетода(Параметры) Экспорт
//какой-то исполняемый код
КонецПроцедуры

Процедура ИмяВторогоМетода(Параметры) Экспорт
//какой-то исполняемый код
КонецПроцедуры

Функция ПараметрыПервогоМетода(ВажнаяСущность)

Результат = Новый Структура;

Результат.Вставить("Параметр1", ВажнаяСущность.Свойство1);
Результат.Вставить("Параметр2", ВажнаяСущность.Свойство2);

Возврат Результат;
КонецФункции

Функция ТекстВажныеДействияНеОписаны()
Возврат НСтр("ru = 'Ваш разработчик не предусмотрел выполнение сценария.
|Свяжитесь с его начальником, он даст ему просраться'");
КонецФункции

Результат этого подхода
➡️повышается читаемость метода
➡️упрощается расширение
➡️упрощается изменение
➡️появляется возможность разделить ответственность (если ВажнаяСущность может быть различными объектами, то перенести исполняемые методы в соответствующие модули)

ОбщегоНазначения.ВыполнитьМетодКонфигурации
- это обёртка безопасного выполнения кода из БСП
ОбщегоНазначения.ВыполнитьМетодОбъекта - это вариант, если требуется выполнение метода, описанного в модуле конкретного объекта

Отдельная функция ПараметрыДляМетодов() - это усложнение на случай, если Вам требуются разные параметры для каждого случая, чаще это не так и можно обойтись без неё.

Вариант полезного усложнения функционала -добавить место хранения (в 1С это может быть, к примеру, регистр сведений), где методы будут указаны с определенными ключами. Может понадобиться, если выбираемый метод зависит не только от значения ВажнойСущности, но и еще от лунных циклов заказчика.

#медвежийкодстайл
  • 👍 6
  • 👎 2
  • 🔥 2
  • 💯 2
More from @bearrambles
  1. Sep 25, 2026Первый блин комом ли? Итак, стрим закончился. Вайбово было точно. Моё главное опасение был…
  2. Sep 23, 2026Post #136
  3. Sep 9, 2026Пошёл в веб-кам Мне нравится, когда из пары сказанных между делом слов получается что-то и…
  4. Aug 25, 2026Post #134
  5. Aug 24, 2026Всем привет👋 Да, я знаю, что не было значащих постов уже почти 3(!!!!) недели😂 Ну вот та…
  6. Aug 16, 2026Post #132
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →