ダウンロード サンプルソース (176.4 KB)
パート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でもEntityのFieldメンバになれます。
この時点ではEntityもEntityCollectionもまだ単純なクラスですが、この状態でもそれなりに役に立つサンプルを作ることができます。
この記事は参考になりましたか?
- japan.internet.com翻訳記事連載記事一覧
- この記事の著者
-
japan.internet.com(ジャパンインターネットコム)
japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
TheCPUWizard(TheCPUWizard)
高性能かつ高信頼性のソフトウェアシステム開発に30年の経験を持つシニアソフトウェアアーキテクト。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
