2012-07-02 28 views
8

これはかなり一般的な質問ですが、私は今日デリゲートについて疑問を抱いていました。この時点では、ピッカーやテーブルビューなどの選択肢を渡すような明白なケースを除いて、私が実際に使用する時間や使用しない時間はありません。たとえば、オブジェクトへの参照を渡してメソッドを呼び出すことができる状況がある場合、デリゲートを実装する理由はありますか?要約すると、使用を意図したデリゲートパターンとは何ですか?使用しない方が良いでしょうか?デリゲートを使用する(または使用しない)場合

すばやく包括的な回答をいただきありがとうございます。彼らはすべて非常に有用でした。

答えて

4

利点の(同じイベントについて複数のオブジェクトを伝える)コントローラで同じプロトコルの複数のデリゲートを持つように向いていませんデリゲートパターンは、デリゲートオブジェクトとそのデリゲートの間の疎結合です。疎結合は、他のコンテキストでクラスの再利用性を向上させます。

デリゲートオブジェクトは、(デリゲートプロトコルを実装するという要件を除いて)通信するオブジェクトについて何も知っている必要はありません。特にそのクラスやそのメソッドはありません。後で別のコンテキストでコンポーネントを再利用する場合や、別のクラスの別のオブジェクトと通信する場合は、このオブジェクトが行う必要があるのはデリゲートプロトコルを実装することだけです。委任オブジェクトはまったく変更する必要はありません。

これには欠点もあります。もう少しコードが必要で、書くコードは明示的ではないため、理解するのが少し難しいかもしれません。この(一般的に小さい)トレードオフが価値があるかどうかは、ユースケースによって異なります。いずれにしても2つのオブジェクトが緊密に結合されており、将来の再利用の可能性が低い場合は、デリゲートパターンを使用することは過度の可能性があります。

3

を参照してくださいthis議論

デリゲートは、イベントが発生したときに一つのオブジェクトが別のオブジェクトにメッセージを送信することができます。

賛否

  • 非常に厳密な構文。聞こえるすべてのイベントは、 の委任プロトコルで明確に定義されています。

  • コンパイル時間メソッドがデリゲートであるべきであるように実装されていない場合の警告/エラー。

  • プロトコルはコントローラの範囲内でのみ定義されています。

  • 非常に追跡可能で、アプリケーション内での制御フローを簡単に識別できます。

  • 複数のプロトコルを持つコントローラを1つ定義し、それぞれが異なる代理人を持つことができます。

  • 通信プロセスの保守/監視に必要な第三者オブジェクトはありません。

  • 呼び出されたプロトコルメソッドから戻り値を受け取る機能。これは、デリゲートがコントローラに の情報を戻す手助けをすることができることを意味します。

短所

    定義するために必要なコードの
  • 行数:1.プロトコル定義、コントローラ2.デリゲート性、および3デリゲートメソッド定義の実装デリゲート自体の中で。

  • デリゲートをオブジェクトの割り当て解除に正しく設定しないように注意する必要があります。そうしないと、割り当てられていないオブジェクトのメソッドを呼び出すとメモリがクラッシュする可能性があります。

  • 可能であるが、それは困難であることができ、パターンは実際

2

委任の「ユースケース」は、継承の場合とほぼ同じです。つまり、クラスの振る舞いを多態的に拡張します。そのタスク

ソフトウェア工学で

、委任パターンは、オブジェクト指向プログラミングにおけるデザインパターンがどこにある代わりに規定されたのいずれかのタスクを実行するオブジェクトは、代表者:wikipediaが委任を定義する方法

はこれがありますヘルパオブジェクトに関連付けられます。委任者として知られるヘルパーオブジェクトに委任者のタスクを実行する責任が与えられている責任の反転(Inversion of Responsibility)があります。委任パターンは、構成(アグリゲーションとも呼ばれる)、ミックスイン、およびアスペクトなどの他のソフトウェアパターンの基礎となる基本的な抽象パターンの1つです。

、明らかに、委任と継承されているが、最大のものの間に多くの相違点は、IMO、その継承は、2つのクラス間の固定(別名、コンパイル時)の関係は、ある代表団は、実行時にそこに定義することができますされている間(これをサポートする言語で)時間。一方、継承は多型性をよりよくサポートします。

委任は大きなトピックです(継承がそうであるように)、あなたはそれについてたくさん読むことができます。最後に、委任または継承を使用するかどうかを決めることは、「is-a」または「has-a」関係を望むかどうかを決めることになるため、その選択のガイドラインをリストするのは簡単ではありません。私にとって

、基本的には、デリゲートを作成するという決定は、観察から来ている:私のコードは、共通の「自然を持つものとして認識できる(ここでは、均質な手段均質な行動の集合を提示し

  1. ");

  2. これらのビヘイビアは、特定のケース(「in」のように「代替」ビヘイビアに置き換えられる)で「カスタマイズ」されている可能性があります。

これは私の個人的な見解であり、「委任」パターンを特定する方法の説明です。おそらく、私のプログラミング規律はリファクタリングの原則によって強く知らされているという事実と関係があります。

本当に、IMOは、あなたのクラスのための "カスタマイズ"ポイントを定義する方法です。例として、ある種の抽象的なワークフローがある場合は、各ステップで特定の条件に応じて何らかのアクションを取ることができます。さらに、これらの具体的な行動を他の種類のものに置き換えることができれば、私はそこに代表団を通じて再利用のチャンスがあると思う。

これが役に立ちます。

関連する問題