Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

スマートなアプリケーションアーキテクチャの構築(2)

汎用クラスによるインスタンス群の一元管理

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/04/08 14:00

 パート1では、似たようなコーディングを繰り返さなくても(簡単な)検証と変更通知が同時に行えるインテリジェントフィールドの作成方法を詳しく説明しました。今回はこれを拡張して便利なインテリジェントクラスにしてみましょう。主なねらいは、汎用のFieldクラスから特定の用途向けに作成したインスタンス群を一元的に扱えるようにすることです。具体的には、インターフェイスを作成し、その実装のためにクラスを更新します。

目次

はじめに

 このシリーズでは、ほぼどんなサイズのプログラムでも利用できるシンプルなアプリケーションアーキテクチャの構築を取り上げます。ただし、掲載するコードは概念を説明するためのもので、そのまま実稼働環境で使えるわけではありません。

前回の復習

 パート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でもEntityFieldメンバになれます。

 この時点ではEntityEntityCollectionもまだ単純なクラスですが、この状態でもそれなりに役に立つサンプルを作ることができます。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

  • TheCPUWizard(TheCPUWizard)

     高性能かつ高信頼性のソフトウェアシステム開発に30年の経験を持つシニアソフトウェアアーキテクト。

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5