Является ли передача функции как параметра видом полиморфизма?

Добрый день,
можно ли считать полиморфизмом функции Foo передачу ей другой функции как параметра для оперирования на другими аргументами?

UPD: немного изменил пример
function Foo (arg1, arg2, cb){
    var res=cb(arg1, arg2)+10;
    console.log(res);
}

function sum (arg1, arg2){
	return arg1+arg2;
}
function mult (arg1, arg2){
	return arg1*arg2;
}
Foo(2, 3, sum);  //5
Foo(2, 3, mult); //6


UPD2: Это модель. В реальном примере функция Foo могла бы быть единственно экспортируемой из модуля. И конечно в ней была бы не одна инструкция, плюс вызовы других функций и тд. Пользователь модуля мог-бы менять его внутреннюю реализацию отправляя на вход свою функцию (sum, mult или что-то совершенно иное). Если учитывать что функции в JS тоже являются объектами, то получается что мы меняем реализацию методов объекта не имея доступа к его коду. Это полиморфизм?
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Я бы сказал, что это вообще антипаттерн - зачем Foo знать о каких-то аргументах и функциях, если всё, что она делает - это выводит сообщение в консоль.
Правильно было бы сделать так:
function log (message){
  console.log(message);
}
function sum (arg1, arg2){
  return arg1+arg2;
}
function mult (arg1, arg2){
  return arg1*arg2;
}

log(sum(2, 3));
log(mult(2, 3));

Попробуйте привести более реальный пример, где такое поведение может понадобиться.

Это модель. В реальном примере функция Foo могла бы быть единственно экспортируемой из модуля. И конечно в ней была бы не одна инструкция, плюс вызовы других функций и тд. Пользователь модуля мог-бы менять его внутреннюю реализацию отправляя на вход свою функцию (sum, mult или что-то совершенно иное). Если учитывать что функции в JS тоже являются объектами, то получается что мы меняем реализацию методов объекта не имея доступа к его коду. Это полиморфизм?

Это что-то между композицией и полиморфизмом. Конкретная реализация может быть ближе к одному или другому краю спектра, но более правильное решение, на мой взгляд - композиция.
Если у вас есть какая-то бизнес логика, выполняющаяся внутри объекта, но не являющаяся его частью, значит - эта логика должна быть в отдельной сущности и тогда это чистая композиция.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Полиформизм в своём определении опирается только на сами типы данных, а не на то, что они могут и как функционируют. Ответ - нет.

Более того, ваш пример не имеет смысла. Если передаваемая функция не делает ничего кроме манипуляции с аргументами переданными вместе с ней, то она должна выполняться до основной функции и передавать в неё лишь свой результат. Иначе идёт смешение логики.
Ответ написан
@dixoNich
frontend developer
Нет. Скорее, Foo - это функция высшего порядка, но это уже из функционального программирования.
Если уж так и быть, рассмотреть это в качестве полиморфизма, то cb должен как минимум вызываться в контексте Foo, то есть cb.call(this, arg1, arg2)
Но вообще нет, это не полиморфизм.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы