私は機能的なスタイルでプログラミングが好きです。しかし、関数を引数として渡すと、関数の引数が渡されない場合よりもコンポーネント間の結合が強くなることがあります。引数としての機能:強い結合?
たとえば、以下の(考案された)例では、A、B、およびCは、Cの関数引数の出力型、Cのint引数の型、およびCの引数の型および入力型によって結合されます関数の引数。 Aがその機能をBiFunctionに変更したい場合は、BとCの両方を変更する必要があります。 A及びBは、アップフロント関数の結果を計算例に
public class Functional {
public void A() {
C(i -> String.valueOf(i + 2), 123);
}
public void B() {
C(i -> String.valueOf(i + 1), 123);
}
private String C(Function<Integer, String> f, int a) {
int len = String.valueOf(a).length();
return f.apply(len);
}
}
コントラストこれは、文字列結果と、B、及びCは2つだけに接続されている。ここでCに第int引数を渡しますplaces - Cの2つの引数。最初の引数を計算する関数は自由に変更できます。
関数を渡すことは明らかですが、この種の問題は、複雑になると厳密なコードが合成されて作成されるようです。このような方法で結合することが大丈夫なのかどうかを決めるために使用する経験則を聞いてみたいと思います。あなたの例では
これは奇妙なことです。 1)呼び出し元がいつメソッドのパラメータタイプを変更することができるのか、「* A関数をBiFunction *に変更したい場合は? 'C'は機能を提供し、前提条件を定義します。 'A'はここで何か「欲しい」必要はありません。 2) 'C'がパラメータ型としての機能を持つ必要がなければ、関数を取得する必要はありません。提供された機能がそれを要求するならば、それは議論の余地がある。あなたの例では、それはそれなりに考案されているので、呼び出し側が関数の結果を計算するのは不可能*です。しかし、彼らは*後に*することができます。 – Holger