これを行うための用語があります:func1(func2()、func3());


24

これobj.func1().func2()はメソッドチェーンと呼ばれますが、次の専門用語は何ですか?

func1(func2(), func3());

関数の戻り値が別の引数として使用される場合。


8
obj.func1().func2() is called method chaining-訂正:列車事故と呼ばれます。
ヤムマルコビッチ

obj.func1()常にfunc2()メンバー関数としてのオブジェクトを返すことが確実でない限り、それは非常に、非常にトリッキーに聞こえます。
シャドゥール

8
@ヤムケアを説明しますか?とりわけ、流fluentなインターフェイスで大きな利益を得るために採用されています。デメテルの法則に言及していますか?もしそうなら、これは上記のパターンを禁止しません、そしてそれがそうする場合でさえ、LoDに対して良いケースがあります。
コンラッドルドルフ

1
メソッドの連鎖は、構文上の砂糖を使用して1つの棚にあり、大騒ぎする必要はありません。
コス

1
@PauliØsterøこれがスタックトレースの目的だと思いました。
クリスC

回答:


38

機能合成だとは思いません。関数の構成とはf . g . h、Haskellのように、2つ以上の関数を取得して新しい関数に変換することを意味します。この時点では関数は呼び出されないことに注意してください。

個人的には、func1(func2(), func3())「ネストされた関数呼び出し」などの構造を参照します。


+1、これは私が見たすべてのプログラミングコンテキストで「ネストされた関数呼び出し」と呼ばれます。
イズカタ

1
+1、これを「関数構成」と呼ぶのは一見間違っています。
ジャン

+1。すべてのf(g())ことはf()、最初の引数に式を使用して呼び出すことです。したがって、関数呼び出しg()は式として修飾されます。ただし、名前を付ける必要がある場合は、できるだけ近い名前にします。
Blrfl

16

数学では、関数合成と呼ばれます。しかし、この用語がプログラミングに適用されると聞いたとは思いません。これは、いくつかの理由で使用がほとんど回避されているためかもしれません。コンパイラーがfunc2の前にfunc3を自由に評価できるため、関数に副作用がある場合、奇妙なバグを引き起こす可能性があります。ブレークポイントを設定したり、中間結果を出力したりすることができないため、デバッグが難しくなります。ほとんどの人は読みにくいと感じています。


4
関数型プログラミングでも合成と呼ばれます。
チャック

8
私はそれが「大いに回避された」とは思わない。IMO printf("%d %d\n", strlen(a), strlen(b));では、中間変数を使用する代わりにコードを記述することは珍しくありません。
user281377

3
関数に副作用がある場合の奇妙なバグの解決策は、これを回避することではなく、代わりに値を生成して副作用を持つ関数の作成を回避することだと思います。同様に、デバッガーに関しては、デバッガーを動作させるためにコードを変更することを強制しない、より良いデバッガーを要求する必要があります。
R.マルティーニ・フェルナンデス

7
コンパイラがfunc2の前にfunc3を自由に評価できるかどうかは、使用される言語に完全に依存します。たとえば、Javaでは、評価順序が厳密に指定されています。私は実際、これがほとんどの言語に当てはまると疑っています。
マイケルボルグワード

2
数学の「関数構成」という用語は、実際には単一引数関数にのみ適用され、フォームの構造を指しfunc1(func2(func3(x)))ます。または技術的に、それが指す関数自身:もしg(x) = f1(f2(f3(x)))、次いでgしない g(x))の組成物であるf1f2f3。質問の構造を「関数構成」と呼ぶ方法を見ることができましたが、数学的な意味でのこの用語の非常に珍しい使用法として私を襲っています。
デビッド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();

Wikipediaのプログラミングで直交性の詳細を読むことができます。これに関するStackOverflowについての質問があります。


それは直交性を示しているのではなく、それに依存しています。
ラファエル

あなただけの値を渡している1、OPの呼び出しには魔法はありません
vemv

1

私は用語についてはそれほど良くありませんが、数日前に高次関数という用語を参照した記事を読んだところです。ウィキペディアごとの定義の要約を次に示します。

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

数学およびコンピューターサイエンスでは、高階関数、関数形式、または関数は、次の少なくとも1つを行う関数です。

  • 入力として1つ以上の関数を取ります
  • 関数を出力する

他のすべての関数は1次関数です。数学では、高階関数は演算子または関数としても知られています。関数を別の関数にマップするため、微積分の微分は一般的な例です。

したがって、この場合、そのシナリオは入力/パラメーターとして少なくとも1つの関数を使用するため、より高次の関数と見なされます。


1
いいえ、高階関数を呼び出すと次のようになりますfunc1(func2, func3)。括弧がないことに注意してください。
fredoverflow

それは理にかなっているフレッド。1つは関数のアドレスであり、もう1つはその関数の実行結果です。それを指摘してくれてありがとう。
silverCORE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.