SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

japan.internet.com翻訳記事

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

検証機能とイベント駆動ロジックの実装

 これで、すべてのフィールドに検証機能を追加することができます。

public class InvoiceLineItem
{
   public readonly Field<Guid> ItemID = new Field<Guid>();
   public readonly Field<Guid> InvoiceID = new Field<Guid>();
   public readonly Field<int> LineNumber = new Field<int>();
   public readonly Field<decimal> Quantity =
      new Field<decimal>(new RangeValidator(1, 100));
   public readonly Field<bool> Taxable = new Field<bool>();
   public readonly Field<decimal> UnitPrice =
      new Field<decimal>(new RangeValidator(0.01M, 9999M));
   public readonly Field<decimal> Weight =
      new Field<decimal>(new RangeValidator(0.1M, 99M));
   public readonly Field<decimal> ExtendedPrice =
      new Field<decimal>();
}

 指定した範囲外の値を代入しようとすると、自動的にArgument Exception(引数例外)を返すようになりました。次に、Valueの変更に対してクラスオブジェクトが自動で反応するようにします。ここでも、Fieldクラスを拡張することでこの機能を実装します。

public class Field<DATA_TYPE>
{
   public class ValueChangedEventArgs : EventArgs
   {
      internal ValueChangedEventArgs(DATA_TYPE oldValue,
                                     DATA_TYPE newValue)
      {
         OldValue = oldValue;
         NewValue = newValue;
      }

      public readonly DATA_TYPE OldValue;
      public readonly DATA_TYPE NewValue;
   }

   public event EventHandler<ValueChangedEventArgs> ValueChanged;
   private void Fire_ValueChanged(DATA_TYPE oldValue,
                                  DATA_TYPE newValue)
   {
      if (ValueChanged != null)
          ValueChanged(this,
             new ValueChangedEventArgs(oldValue, newValue));
   }
   public DATA_TYPE Value
   {
      get { return m_Value; }
      set
      {
         if (!Equals(m_Value, value))
        {
            DATA_TYPE oldValue = m_Value;
            m_Validator.Validate(value);
            m_Value = value;
            Fire_ValueChanged(oldValue, m_Value);
        }

      }
   }
}

 この機能は、クラスに「ビジネスロジック」を含めるようになった段階で使用することができます。

public class Field<DATA_TYPE>
{
   public class ValueChangedEventArgs : EventArgs
   {
      internal ValueChangedEventArgs(DATA_TYPE oldValue,
                                     DATA_TYPE newValue)
      {
         OldValue = oldValue;
         NewValue = newValue;
      }

      public readonly DATA_TYPE OldValue;
      public readonly DATA_TYPE NewValue;
   }

   public event EventHandler<ValueChangedEventArgs> ValueChanged;
   private void Fire_ValueChanged(DATA_TYPE oldValue,
                                  DATA_TYPE newValue)
   {
      if (ValueChanged != null)
                 ValueChanged(this,
                 new ValueChangedEventArgs(oldValue, newValue));
   }
   public DATA_TYPE Value
   {
      get { return m_Value; }
      set
      {
         if (!Equals(m_Value, value))
        {
           DATA_TYPE oldValue = m_Value;
           m_Validator.Validate(value);
           m_Value = value;
           Fire_ValueChanged(oldValue, m_Value);
        }

      }
   }
}

まとめ

 ここまでで、検証機能とイベント駆動ロジックの両方を実装する簡単なアーキテクチャができました。これはほんの始まりに過ぎません。次回は、クラスレベルに同様の原則を適用して、インテリジェントなエンティティやコレクションを生成します。今後の記事では、ユーザーインターフェース(UI)に対するデータのバインドやインテリジェントな永続性についても取り上げる予定です。

詳細情報

 本連載における情報は、Dynamic Concepts Development社発行のガイド『Smart Architecture』に基づいています。これはオープンなアーキテクチャであるとともに、開発者コミュニティで自由に利用できる推奨インターフェース群です。商企業は、このアーキテクチャを利用して実装やツールセットの開発を行うことができます。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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/3687 2009/04/07 14:00

イベント

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

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

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

メールバックナンバー