はじめに
このシリーズでは、ほぼどんなサイズのプログラムでも利用できるシンプルなアプリケーションアーキテクチャの構築を取り上げます。ただし、掲載するコードは概念を説明するためのもので、そのまま実稼働環境で使えるわけではありません。
前回の復習
パート1では、似たようなコーディングを繰り返さなくても(簡単な)検証と変更通知が同時に行えるインテリジェントフィールドの作成方法を詳しく説明しました。
パート2: インテリジェントエンティティの作成
インテリジェントフィールドが作成できるようになったので、これを拡張して便利なインテリジェントクラスにしてみましょう。まず、既存のクラスにいくつか手を加える必要があります。主なねらいは、汎用のField
クラスから特定の用途向けに作成したインスタンス群を一元的に扱えるようにすることです。具体的には、インターフェイスを作成し、その実装のためにクラスを更新します。
public interface IField { event EventHandler<ValueChangedEventArgs<Object>> Changed; } public class Field<DATA_TYPE> : IField { // Basic implementation remains the same with the following // additions/changes... private void Fire_ValueChanged(DATA_TYPE oldValue, DATA_TYPE newValue) { if (ValueChanged != null) ValueChanged(this, new ValueChangedEventArgs<DATA_TYPE> (oldValue, newValue)); if (Changed != null) Changed(this, new ValueChangedEventArgs<Object> (oldValue, newValue)); } public event EventHandler<ValueChangedEventArgs<Object>> Changed; }
以上の変更でField<T>
のインスタンスはすべてIField
として扱えるようになったので、Entity
クラスの作成に移りましょう。公開する関数は次のとおりです。
public class Entity : IField { public void RegisterField(string name, IField field) {...} public Field<DATA_TYPE>GetField<DATA_TYPE>(string name) {} public event EventHandler<ValueChangedEventArgs<object>> Changed; public event EventHandler<FieldValueChangedEventArgs> FieldChanged; }
これで、次の基本的な機能が使えるようになります。
Entity
へのField
の登録とその名前の割り当て- 名前による
Field
の取得 Field
からEntity
自体へのイベントの伝播
Entity
はそれ自体がIField
であることに注意してください。そのため実体の作成が可能ですが、フィールドそのものは実体です。
また、こうした実体のコレクションも作成できるようにしておく必要があります。とりあえず、重要なメソッドとプロパティをいくつか実装しておきましょう。
public class EntityCollection<KEY_TYPE, ENTITY_TYPE> : Entity where ENTITY_TYPE : Entity { public void Add(KEY_TYPE key, ENTITY_TYPE item) {} public bool Remove(KEY_TYPE key) {} public event EventHandler<CollectionChangedEventArgs> CollectionChanged; public void Clear() public int Count { get { } } public ENTITY_TYPE this[KEY_TYPE key] {} }
EntityCollection
自体はEntity
(したがってIField
)です。そのため、どんなEntityCollection
でもEntity
のField
メンバになれます。
この時点ではEntity
もEntityCollection
もまだ単純なクラスですが、この状態でもそれなりに役に立つサンプルを作ることができます。