Лирическое отступление.
Полиморфизм вообще отличный пример того, о чём говорил Ларри Уолл, говоря о главных качествах программиста: нам лень даже собственные слова придумывать — мы тупо пиздим чужие, иногда даже меняя суть, как нам удобно. Вот полиморфизм взяли погонять у биологов.
Если попытаться просто описать полиморфизм и все его ответвления, то получится что-то типа «для многих проблем — одно решение».
Задача. Сформулируем её максимально просто и в общем виде: расчет некоторых данных, исходя из заданного параметра
Ступень первая. Частное.
Для решения задачи скорее всего родится какой-нибудь метод
ВажныеДанныеПоЗначениюПараметра(ЗначениеПараметра). Выглядит вполне себе ок. Когда наступит момент и придёт понимание, что задача должна решаться и для нескольких объектов, родится метод ВажныеДанныеПоНесколькимЗначениям(МассивЗначенийПараметра). Вроде тоже ок. Как будто.Ступень вторая. Обобщение.
Разработчик начинает задумываться, что вроде как оба метода решают одну задачу и было бы хорошо, чтобы метод всё-таки был один. И приходит к созданию некоторого метода-обёртки
Функция ВажныеДанные(Параметр)
Если ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = ВажныеДанныеПоНесколькимЗначениям(Параметр)
Иначе
Результат = ВажныеДанныеПоЗначниюПараметра(Параметр)
КонеЦЕсли;
Возврат Результат;
КонецФункции
Ступень третья. Приведение.
Наступает осознание, что функция расчета данных по одиночному параметру может быть и вообще не нужна, а следовательно — стоит привести входящий параметр к массиву в любом случае
Функция ВажныеДанные(Параметр)
ПараметрКакМассив = ПреобразоватьВМассив(Параметр);
Результат = ВажныеДанныеПоНесколькимЗначениям(ПараметрКакМассив)
Возврат Результат;
КонецФункции
Функция ПреобразоватьВМассив(Параметр)
//есть ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве
//но для раскрытия примера лучше будет так
Результат = Параметр;
Если Не ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = Новый Массив;
Результат.Добавить(Параметр);
КонеЦЕсли;
Возврат Результат;
КонецФункции
И это уже хорошо — хотя бы потому, что в случае изменения логики расчета данных необходимо будет проводить в одном месте
Ступень четвертая. Понимание границ.
Это хорошо, когда разработчик задумывается о независимости и вариативности метода. Полиморфизм является основой для многих паттернов программирования.
Но не менее важно понимать, когда излишняя универсализация идёт во вред. Конкретно в этом примере — хорошо, когда результатом метода является одно исходящее значение, и логике, в целом, всё равно, на каком количестве входящих данных оно построено.
Часто есть задачи, когда удобный вариант исходящего значения будет зависеть от входящих параметров - их количества или типа.ю когда требуется сохранить зависимость между каждым отдельным объектом набора входящих данных и рассчитанным на его основании значением. Но сам расчет оптимально выполнять по массиву параметров, а не через цикл.
В таких ситуациях лучше обзавестись функциями-обёртками преобразования к нужному результату (как пример - получение значения реквизита библиотечным методом), по сути - способ извлечения информации в вид, удобный для конкретного сценария.
В нашем же случае, это может выглядеть примерно так
Функция ВажныеДанныеПоЗначениюПараметра(ЗначениеПараметра)
Результат = ВажныеДанные(Параметр);
Возврат Результат[ЗначениеПараметра];
КонецФункции
Функция ВажныеДанныеПоНесколькимЗначениям(МассивЗначенийПараметра)
Результат = ВажныеДанные(МассивЗначенийПараметра);
Возврат Результат;
КонецФункции
Функция ВажныеДанные(Параметр)
ПараметрКакМассив = ПреобразоватьВМассив(Параметр);
Результат = ВажныеДанныеПоНесколькимЗначениям(ПараметрКакМассив)
Возврат Результат;
КонецФункции
Функция ПреобразоватьВМассив(Параметр)
Результат = Параметр;
Если Не ТипЗнч(Параметр) = Тип("Массив") Тогда
Результат = Новый Массив;
Результат.Добавить(Параметр);
КонеЦЕсли;
Возврат Результат;
КонецФункции
И это совсем не то, с чего мы начинали
#медвежийкодстайл