TGViewer
Bear's Rambles | МЕДВЕДЬ ГОВОРИТ... Bear's Rambles | МЕДВЕДЬ ГОВОРИТ... @bearrambles · 128 subscribers
Post #92 159
Взгляд на ступени самосознания разработчика через полиморфизм.

Лирическое отступление.

Полиморфизм вообще отличный пример того, о чём говорил Ларри Уолл, говоря о главных качествах программиста: нам лень даже собственные слова придумывать — мы тупо пиздим чужие, иногда даже меняя суть, как нам удобно. Вот полиморфизм взяли погонять у биологов.

Если попытаться просто описать полиморфизм и все его ответвления, то получится что-то типа «для многих проблем — одно решение».


Задача. Сформулируем её максимально просто и в общем виде: расчет некоторых данных, исходя из заданного параметра

Ступень первая. Частное.

Для решения задачи скорее всего родится какой-нибудь метод ВажныеДанныеПоЗначениюПараметра(ЗначениеПараметра). Выглядит вполне себе ок. Когда наступит момент и придёт понимание, что задача должна решаться и для нескольких объектов, родится метод ВажныеДанныеПоНесколькимЗначениям(МассивЗначенийПараметра). Вроде тоже ок. Как будто.

Ступень вторая. Обобщение.

Разработчик начинает задумываться, что вроде как оба метода решают одну задачу и было бы хорошо, чтобы метод всё-таки был один. И приходит к созданию некоторого метода-обёртки
Функция ВажныеДанные(Параметр)
Если ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = ВажныеДанныеПоНесколькимЗначениям(Параметр)
Иначе
Результат = ВажныеДанныеПоЗначниюПараметра(Параметр)
КонеЦЕсли;

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


Ступень третья. Приведение.


Наступает осознание, что функция расчета данных по одиночному параметру может быть и вообще не нужна, а следовательно — стоит привести входящий параметр к массиву в любом случае
Функция ВажныеДанные(Параметр)
ПараметрКакМассив = ПреобразоватьВМассив(Параметр);
Результат = ВажныеДанныеПоНесколькимЗначениям(ПараметрКакМассив)
Возврат Результат;
КонецФункции

Функция ПреобразоватьВМассив(Параметр)
//есть ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве
//но для раскрытия примера лучше будет так
Результат = Параметр;

Если Не ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = Новый Массив;
Результат.Добавить(Параметр);
КонеЦЕсли;

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

И это уже хорошо — хотя бы потому, что в случае изменения логики расчета данных необходимо будет проводить в одном месте

Ступень четвертая. Понимание границ.

Это хорошо, когда разработчик задумывается о независимости и вариативности метода. Полиморфизм является основой для многих паттернов программирования.

Но не менее важно понимать, когда излишняя универсализация идёт во вред. Конкретно в этом примере — хорошо, когда результатом метода является одно исходящее значение, и логике, в целом, всё равно, на каком количестве входящих данных оно построено.

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

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

В нашем же случае, это может выглядеть примерно так
Функция ВажныеДанныеПоЗначениюПараметра(ЗначениеПараметра)
Результат = ВажныеДанные(Параметр);
Возврат Результат[ЗначениеПараметра];
КонецФункции

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

Функция ВажныеДанные(Параметр)
ПараметрКакМассив = ПреобразоватьВМассив(Параметр);
Результат = ВажныеДанныеПоНесколькимЗначениям(ПараметрКакМассив)
Возврат Результат;
КонецФункции

Функция ПреобразоватьВМассив(Параметр)

Результат = Параметр;

Если Не ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = Новый Массив;
Результат.Добавить(Параметр);
КонеЦЕсли;

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

И это совсем не то, с чего мы начинали

#медвежийкодстайл
  • ✍ 3
  • 🔥 2
  • 👍 1
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 →