気になった事を自由に書いてます。
      
デリゲート(Delegate)の用途1
C#に出てくるデリゲート。仕組みは理解してるけど、どの場面で使うのかわからない。
という人は結構いるのではないでしょうか。という私もベストな使い道なんて知りませんが
ここでは、私が実際に使ったデリゲートのサンプルをアップしたいと思います。
こういった使い方ができるよ、程度に見ていただけると嬉しいです。

デリゲートの用途1

DBに入っているテーブルA(表)をモニタリングするアプリを例にします。
データ取得クラスは一定間隔でDBからデータを取ってきてイベントを発生させ、
画面クラスへデータを渡します。画面クラスはデータを画面へ表示しています。

仕様変更で、画面上のチェックボックスをチェックしているときは別のテーブルBを参照する
ようにしてほしい。ただ、テーブルBにデータが入っていない場合はテーブルAを参照してほしい。

どうやったら実現できるかを考えます。
データ取得クラスはテーブルBの情報を抽出するメソッドが必要です。次にテーブルAかB
どちらを参照したらいいのか条件分岐を作りたいですがデータ取得クラスは画面クラスの
情報を持っていないので今のままでは判断できません。

画面クラスのチェックボックス変更イベントでデータ取得クラスへチェック状態を
通知する方法だとなんとか判断できそうです。
こうすると、データ取得クラスに画面クラスのチェックボックスの状態を保持するメンバ変数
が必要となります。データ取得クラスはDBからデータを抽出し、画面クラスへデータを渡す
ことが役目です。必要なメンバ変数は持っててOKですが、関係の無いチェックボックスの
状態を保持するメンバ変数はできれば持ちたくありません。

そこでデリゲートを利用します。

デリゲートの用途1

メリット
  • クラスに不適切なメンバ変数が増えない。
  • メンバ変数が増えないので、他のメソッドが誤ってメンバ変数を使うことがない。
  • 修正したメソッドの影響について悩まなくなる。^^;

  • デメリット
  • デリゲートを使うと机上デバッグが難しくなる。

  • 複数のクラスから呼び出されるメソッドを、あるパターンだけ処理を変える。あるパターン
    というのは呼び出し元クラスで定義して、定義してない場合は今まで通りの動きにする。
    テストするときって変更した箇所を重点的に見て(ここではあるパターンのとき)、
    従来通りの処理の動きを確認するテストは見落としがちになります。この方法だと
    呼び出し元でデリゲートを設定してなければ従来通りの動きとなるので便利です。

          




    Effective C# 4.0
    ビル・ワグナー
    ¥ 3,780



    Copyright (C) 2011 - 2017 猫の気ままなC#日記