SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

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

 パート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もまだ単純なクラスですが、この状態でもそれなりに役に立つサンプルを作ることができます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Invoiceサンプルコードの拡張

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

TheCPUWizard(TheCPUWizard)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3688 2009/04/08 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング