чи є термін для цього: func1 (func2 (), func3 ());


24

Я знаю, що obj.func1().func2()це називається методом ланцюга, але що таке технічний термін для:

func1(func2(), func3());

Якщо повернення функції використовується як аргумент іншій.


8
obj.func1().func2() is called method chaining- Виправлення: Це називається аварія поїзда.
Ям Маркович

Це звучить дуже, дуже, дуже хитро, якщо ви абсолютно не впевнені, що obj.func1()завжди повертає об'єкт, який має func2()функцію члена.
Шадур

8
@Yam Care, щоб пояснити? Він використовується для отримання великого прибутку в плавних інтерфейсах, серед інших. Ви посилаєтесь на Закон Деметера? Якщо це так, це не забороняє вищевказану схему, і навіть у тих випадках, коли вона є, є хороший випадок проти LoD.
Конрад Рудольф

1
метод прикування лежить на одній полиці з синтаксичним цукром, не потрібно над цим метушитися.
Кос

1
@ PauliØsterø Я подумав, що саме для цього призначено відстеження стеків.
Кріс С

Відповіді:


38

Я не думаю, що це склад функції. Композиція функцій означає взяти дві або більше функцій і перетворити їх на нову функцію, як f . g . hу Haskell. Зауважте, що в цій точці не викликається жодна функція.

Особисто я б посилався на такі конструкції, як func1(func2(), func3())"вкладені виклики функції".


+1, це називається "вкладеними викликами функцій" у всіх програмах, які я бачив.
Ізката

1
+1, називати цю "композицію функції" оманливо неправильно.
Джан

+1. Все, що f(g())робиться - це дзвінок f()із виразом для першого аргументу, і так трапляється, виклик функції g()кваліфікується як вираз. Але якщо для цього має бути ім’я, це настільки ж близько, як воно стає.
Blrfl

16

У математиці це називається складом функції . Я не думаю, що я чув термін, застосований до програмування. Це може бути тому, що використання в основному уникається з кількох причин. Він може вводити дивні помилки, коли функції мають побічні ефекти, завдяки компіляторам вільно оцінювати func3 перед func2. Це важче налагоджувати, тому що ви не можете встановити точки прориву або роздрукувати проміжні результати, а більшості людей просто зрозуміло важче читати.


4
Його називають також складом у функціональному програмуванні.
Чак

8
Я не думаю, що цього "значною мірою уникають". IMO не рідкість писати такий код, як printf("%d %d\n", strlen(a), strlen(b));замість використання посередницьких змінних.
користувач281377

3
Я думаю, що рішення дивних помилок, коли функції мають побічні ефекти, полягає не у тому, щоб цього уникнути, а замість цього уникнути написання функцій, які створюють значення та мають побічні ефекти. Аналогічно, стосовно налагоджувачів, рішення має полягати в тому, щоб попросити кращу налагоджувальну машину, яка не змусить вас змінити код, щоб налагоджувач працював.
Р. Мартіньо Фернандес

7
Чи вільний компілятор для оцінювання func3 перед func2, повністю залежить від мови, що використовується. Наприклад, у Java чітко визначено порядок оцінювання. Я насправді підозрюю, що це стосується більшості мов.
Майкл Боргвардт

2
Термін «склад функції» в математиці насправді застосовується лише до одноаргументних функцій, де він відноситься до структури форми func1(func2(func3(x))). Або технічно, це відноситься до функцій самі: якщо g(x) = f1(f2(f3(x))), то g( НЕ g(x) ) є композицією f1, f2і f3. Хоча я міг бачити спосіб, яким ви могли б назвати структуру у питанні "функціональний склад", це вражає мене як дуже незвичне використання терміна, в математичному сенсі.
David Z

2

Як вказує @Karl Bielefeldt, це називається складом функції в Math.

У цій програмі немає технічного терміна. І я вважаю, що це гарна річ, бо це вказує на те, що операція нормальна і ортогональна .

Ортогональність мов програмування означає, що ви можете використовувати інструкцію / операцію незалежно від її контексту . Наприклад, ви можете викликати функцію / метод усіма наведеними нижче способами, і вона поводитиметься однаково ...

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

Ви можете прочитати докладніше про "Ортогональність" у програмуванні у Вікіпедії , і тут є питання щодо StackOverflow .


Це не вказує на ортогональність, але залежно від цього.
Раффаель

+1 Ви просто передаєте значення, у виклику ОП немає ніякої магії
vemv

1

Я дійсно не такий хороший в термінах, але я просто прочитав статтю кілька днів тому, в якій згадувався термін Функції вищого порядку , і ось конспект визначення в Вікіпедії:

http://en.wikipedia.org/wiki/Higher-order_function

У математиці та інформатиці функції вищого порядку, функціональні форми або функціонали - це функції, які виконують принаймні одне з наступного:

  • прийняти одну або кілька функцій як вхід
  • вивести функцію

Усі інші функції - це функції першого порядку. У математиці функції вищого порядку також відомі як оператори або функціонали. Похідна в обчисленні є поширеним прикладом, оскільки вона відображає функцію в іншій функції.

тож у цьому випадку, оскільки цей сценарій виконує принаймні одну функцію як вхід / парам, я вважаю, що це функція вищого порядку.


1
Ні, виклик функції вищого порядку виглядав би так func1(func2, func3). Зауважте відсутні дужки.
fredoverflow

це має сенс Фред. одна адреса функції, а друга - результат її виконання. Дякуємо, що вказали на це.
сріблоКОРО
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.