2016-07-29 11 views
0

私は機能的なスタイルでプログラミングが好きです。しかし、関数を引数として渡すと、関数の引数が渡されない場合よりもコンポーネント間の結合が強くなることがあります。引数としての機能:強い結合?

たとえば、以下の(考案された)例では、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

これは奇妙なことです。 1)呼び出し元がいつメソッドのパラメータタイプを変更することができるのか、「* A関数をBiFunction *に変更したい場合は? 'C'は機能を提供し、前提条件を定義します。 'A'はここで何か「欲しい」必要はありません。 2) 'C'がパラメータ型としての機能を持つ必要がなければ、関数を取得する必要はありません。提供された機能がそれを要求するならば、それは議論の余地がある。あなたの例では、それはそれなりに考案されているので、呼び出し側が関数の結果を計算するのは不可能*です。しかし、彼らは*後に*することができます。 – Holger

答えて

3

私は一緒に同じ理由で変更する事を集めSingle Responsibility

の原則に従うことをお勧めします。 異なる理由で変更されるものを分けてください。

したがって、A、BとCをどのように組み合わせるかは、なぜ変更するのかによって異なります。


あなたの例から頭に浮かぶもう一つの原理はRule of least power

ソリューションの選択肢を与えている、あなたの簡略化した例では、あなたの問題

を解決することができる少なくとも強力なソリューションを選びます関数Cは引数として関数を必要としません。その機能はAB側で呼び出すことができます。

2

単純な値を関数の引数に置き換えている場合は、深刻な問題があります。関数は、より丈夫なカップリング(通常はアプリケーション固有のInterface)で置き換える必要があります。

関連する問題