2017-01-09 8 views
0

MSDNによれば、簡単な構成が望ましい場合は代理人の使用をお勧めします。 誰かが例を挙げて説明することができます簡単な構成は?Cで簡単な構成は何ですか

+0

私は構成が何であるか知っています。しかし、MSDNは簡単な合成を言う?違いはありますか? –

+0

簡単には、ハードよりも簡単に実現することができます。定義: '偉大な努力なしに達成。 – musefan

+0

あらかじめ定義された技術用語として、「Easy Composition」(大文字)の例を理解してはいけません。彼らは、「構成」という形ではなく、簡単な構成(達成が容易な「構成」の意味で)を意味します。 – stakx

答えて

1

例が役立ちます。

いくつかのロギングメッセージを出力する必要があるクラスがあり、そのクラスにメッセージをロギングする手段を提供するコンストラクタ依存性注入を使用するとします。クラスのコンストラクタメッセージをログに記録するための方法を含むインターフェイスへ

  1. パス:

    はあなたには、いくつかのオプションがあります。

  2. メッセージを直接記録するデリゲートをクラスコンストラクタに渡します。

    public interface Log 
    { 
        void WriteLine(string message); 
    
        // ... Other methods 
    } 
    

    をし、クラスには、したがって、このようになります:

インタフェースは次のようになります

public sealed class MyClass 
{ 
    readonly ILog _log; 

    public MyClass(ILog log) 
    { 
     _log = log; 
    } 

    public void Test() 
    { 
     _log.WriteLine("Test() called"); 
    } 
} 
このクラスは今 ILogインタフェースに結合され

、および構築それはILogを実装するオブジェクトを提供する必要があります。あなたの代わりにデリゲートを使用している場合

、クラスは次のようになります。

public sealed class MyClass 
{ 
    readonly Action<string> _writeLogLine; 

    public MyClass(Action<string> writeLogLine) 
    { 
     _writeLogLine = writeLogLine; 
    } 

    public void Test() 
    { 
     _writeLogLine("Test() called"); 
    } 
} 

今のクラスは、もは​​やILogに結合されていない、そしてそれを構築する場合、あなたはそれにデリゲートに一致する任意の方法を渡すことができます: - したがって簡単組成

var myClass = new MyClass(Console.WriteLine); 

これはMyClassの組成が容易になります。

+0

Matthew Watsonと@stakx、皆さんは本当に質問に答えました。私は両方のポイントを与えるだろうが、私はマシューワトソンの答えがより正確であることを見るので、私は彼の答えに目を向けることができます。 –

2

このMSDNの記事では、インターフェイスの使用と特定の状況での代理人の使用を比較しています。デリゲートは、インターフェイスに比べて簡単な構成を提供しています。どういう意味ですか?あなたは、このようなインターフェイスを持っていると仮定します。あなたがそれらを構成するにはどうすればよい

ICanWrite first; 
ICanWrite second; 

interface ICanWrite { 
    void Write(); 
} 

は今、あなたは、このようなインターフェースの2件のインスタンスがありますか?だから、どうすれば新しいICanWriteインスタンスは、Writeメソッドはfirst.Writesecond.Writeの両方を実行しますか?簡単ではありません。

は今、あなたの代わりにインタフェースのデリゲートを使用するとします。

static void Main(String[] args) 
{ 
    Action write = null; // Action is a delegate type 
    write +=() => Console.WriteLine("one"); // first write 
    write +=() => Console.WriteLine("two"); // composition, looks quite easy compared to interfaces 
    write(); // both delegates are executed ("one two")  
} 
+0

それは何も説明していません。 – musefan

+0

@musefan確かです。これは、単一のデリゲートが多くのデリゲート(構成)を構成し、コンポジションを構文的に簡単にする '+ = '演算子を示すことを示しています。 – spender

+0

@musefanが少し拡張されました。 – Evk

1

実際には、独自の専門用語であることを意味していないときは、「簡単組成物」と「簡単に構図を」誤解します。それらは単に、インタフェースよりもデリゲートで構成を容易にする(すなわち、作業を少なくする)ことができることを意味する。

しばらく.NETプログラマーであった場合は、System.Actionデリゲートが分かります。あなたはそれがインターフェースであれば、それはどのようになるかとSystem.Actionを比較したときに、MSDNの記事が何を意味するのかを垣間見ることができます。

delegate void Action(); 

interface IAction 
{ 
    void Execute(); 
} 

インタフェースはいくつかのより多くのタイピングを取るのに対し、デリゲートは、ワンライナーです、メソッドの追加名が必要になります。

MSDNの記事は実際には、代理人とインターフェイスの使用についてです。あなたがコールバックハンドラ、onCompletedを取り、いくつかの方法があるとしましょう:

void DoSomethingThatTakesVeryLong(Action onCompleted) 
{ 
    // do something that might take a while: 
    … 
    // notify the caller that we're done: 
    onCompleted(); 
} 

今何それは、このメソッドを使用するために取るのでしょうか?しかし、インターフェイスタイプであった

DoSomethingThatTakesVeryLong(() => Console.WriteLine("Done.")); 

onCompleted場合(のは、上記のIActionを想定してみましょう)、あなたがラップする必要があるだろう:onCompletedはデリゲート型である場合には

は、次のような書くことができます IActionを実装するタイプでコールバックコード:

class DoneLogger : IAction 
{ 
    public void Execute() 
    { 
     Console.WriteLine("Done"); 
    } 
} 

DoSomethingThatTakesVeryLong(new DoneLogger()); 

これは、より多くの仕事です:あなたは本当に必要はありませんクラスに非常に簡単なコードをラップする必要があり、あなたがのために名前を思い付くする必要がありますそのクラスをインスタンス化する必要があります。さて、代議員はいないと想像してください。あなたはいつもそれをしなければなりません。それは定型的なコードがたくさんあるからです。

デリゲートがインターフェイスよりも少ない作業を意味することがわかりました。

関連する問題