C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 34 を表示中)
■17013 / )  イベントの分け方の指針は?
□投稿者/ れい (484回)-(2008/04/15(Tue) 08:51:35)

分類:[.NET 全般] 

れいです。
お世話になっています。

たとえば。

C言語などのオブジェクト指向をサポートしてくれない言語で、
オブジェクト指向な組み方をする場合、
構造体にXXXTypeとかXXXCodeといったフィールドを用意し、
switchで場合分けすることがよくあります。

あるクラスのフィールドをReadOnlyにしたい場合、
ReadOnly専用のクラスを作る場合と、
フラグか何かでReadOnlyに切り替わるようなクラスに変更する方法と、二つあります。

このように、「型」と「フィールド」と「場合分け」は
データとメタデータの関係で密接に関わっていて、
そのうまい切り方もセンスのひとつだと思うわけですが。

----マエフリここまで----

C#とVBのイベントの実装に関して、皆さんの実装の指針を教えてください。

イベントをどこまでどうやって分解するべきかわからない場合の
指針が欲しいと思っています。

MouseClickとFormLoadのように、
意味もパラメーターも違うのならイベントを分けべきなのはすぐにわかるのですが、
微妙な場合は困ります。
たとえば、KeyUp/KeyDownは.Netでは違うイベントですが、
OS内部では同じイベントでパラメーターが違うだけです。
これを「分ける」と決めた理由が欲しいと思います。

イベントの場合、メタデータを含めると
「イベント名」と「イベント引数の型」と「イベント引数内のフィールド」の、
3つに情報を保持できますので、パターンがいっぱいあります。
たとえば以下のようにイベントを分けることができます。


#1 イベント名を分ける場合
public class EventRaiserClass {
  public event EventHandler<AAAEventArgs> AAA;
  public event EventHandler<AAAEventArgs> BBB;
  public event EventHandler<AAAEventArgs> CCC;
  public event EventHandler<AAAEventArgs> DDD;
}
public class AAAEventArgs : EventArgs {};

#2 イベント引数内のプロパティで分ける場合
public class EventRaiserClass {
  public event EventHandler<AAAEventArgs> AAA;
}
public class AAAEventArgs : EventArgs {
  public EventType Type;
}
public enum EventType {
  AAA, BBB, CCC, DDD
}

#3 イベント引数の型だけで分ける場合
public class EventRaiserClass {
  public event EventHandler<EventArgs> AAA;
}
public class AAAEventArgs : EventArgs {};
public class BBBEventArgs : EventArgs {};
public class CCCEventArgs : EventArgs {};
public class DDDEventArgs : EventArgs {};


もちろんこれらを組み合わせることも可能で、

#4 イベントとイベント引数の型で分ける場合
public class EventRaiserClass {
  public event EventHandler<AAAEventArgs> AAA;
  public event EventHandler<BBBEventArgs> BBB;
  public event EventHandler<CCCEventArgs> CCC;
  public event EventHandler<DDDEventArgs> DDD;
}
public class AAAEventArgs : EventArgs {};
public class BBBEventArgs : EventArgs {};
public class CCCEventArgs : EventArgs {};
public class DDDEventArgs : EventArgs {};

とか、いろいろ(2^3=8通り)作れます。

いままで本能の赴くまま作っていたのですが、
他人に説明できなくて困ります。

時と場合による、というのはわかっていますが、
その時と場合とをできるだけ分解して、
適切な実装を得るための指針を得たいと思っています。

たとえば、

・全部ひとつのイベントにまとめる
・EventArgsをできるだけ使いまわしできるように分ける
・イベントハンドラで場合わけしなくていい程度に分ける
・イベント名が長くならないように分ける

など、いろいろ考えられると思います。

みなさんは何を意識して組んでいるのか、
何を意識して組むべきだと思っているのか、
こうやったらうまくいった、という事例など、
教えてください。

返信 編集キー/


管理者用

- Child Tree -