これobj.func1().func2()
はメソッドチェーンと呼ばれますが、次の専門用語は何ですか?
func1(func2(), func3());
関数の戻り値が別の引数として使用される場合。
obj.func1()
常にfunc2()
メンバー関数としてのオブジェクトを返すことが確実でない限り、それは非常に、非常にトリッキーに聞こえます。
これobj.func1().func2()
はメソッドチェーンと呼ばれますが、次の専門用語は何ですか?
func1(func2(), func3());
関数の戻り値が別の引数として使用される場合。
obj.func1()
常にfunc2()
メンバー関数としてのオブジェクトを返すことが確実でない限り、それは非常に、非常にトリッキーに聞こえます。
回答:
機能合成だとは思いません。関数の構成とはf . g . h
、Haskellのように、2つ以上の関数を取得して新しい関数に変換することを意味します。この時点では関数は呼び出されないことに注意してください。
個人的には、func1(func2(), func3())
「ネストされた関数呼び出し」などの構造を参照します。
f(g())
ことはf()
、最初の引数に式を使用して呼び出すことです。したがって、関数呼び出しg()
は式として修飾されます。ただし、名前を付ける必要がある場合は、できるだけ近い名前にします。
数学では、関数合成と呼ばれます。しかし、この用語がプログラミングに適用されると聞いたとは思いません。これは、いくつかの理由で使用がほとんど回避されているためかもしれません。コンパイラーがfunc2の前にfunc3を自由に評価できるため、関数に副作用がある場合、奇妙なバグを引き起こす可能性があります。ブレークポイントを設定したり、中間結果を出力したりすることができないため、デバッグが難しくなります。ほとんどの人は読みにくいと感じています。
printf("%d %d\n", strlen(a), strlen(b));
では、中間変数を使用する代わりにコードを記述することは珍しくありません。
func1(func2(func3(x)))
ます。または技術的に、それが指す関数自身:もしg(x) = f1(f2(f3(x)))
、次いでg
(しない g(x)
)の組成物であるf1
、f2
とf3
。質問の構造を「関数構成」と呼ぶ方法を見ることができましたが、数学的な意味でのこの用語の非常に珍しい使用法として私を襲っています。
@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についての質問があります。
私は用語についてはそれほど良くありませんが、数日前に高次関数という用語を参照した記事を読んだところです。ウィキペディアごとの定義の要約を次に示します。
http://en.wikipedia.org/wiki/Higher-order_function
数学およびコンピューターサイエンスでは、高階関数、関数形式、または関数は、次の少なくとも1つを行う関数です。
- 入力として1つ以上の関数を取ります
- 関数を出力する
他のすべての関数は1次関数です。数学では、高階関数は演算子または関数としても知られています。関数を別の関数にマップするため、微積分の微分は一般的な例です。
したがって、この場合、そのシナリオは入力/パラメーターとして少なくとも1つの関数を使用するため、より高次の関数と見なされます。
func1(func2, func3)
。括弧がないことに注意してください。
obj.func1().func2() is called method chaining
-訂正:列車事故と呼ばれます。