読者です 読者をやめる 読者になる 読者になる

ポンコツXAMLer奮闘記

C#(主にXAML)関連のメモ書きがメインです。

入力チェックの簡略化(概念定義)

C#, XAML

仕事が忙しく、なかなか更新できない日々です。

今回はアプリを作る上で必ず発生する、ユーザー入力チェックを簡略化する方法を紹介します。

これを知れば、いままでイベントハンドラに入力チェックをガリガリ書いていたのが馬鹿らしくなります。

WindowsForm時代によくやっていた方法は以下ですね。
(例が微妙かもしれませんが。。。)

int _Number;

//LostFocusイベントハンドラ
private void TextBox1_LostFocus(object sender, EventArgs e)
{
    TextBox text = (TextBox)sender;
    
    try
    {
        int tempNum;
        tempNum = int.Parse(text.Text);

        // 0以上、100以下だったらOK、他はNG
        if((0 > tempNum) && (100 < tempNum))
        {
            throw new Exception("範囲外エラー");
        }

        this._Number = tempNum; 
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
        
        text.Text = this._Number.ToString();
    }
}

しかし、これだと、項目が増えるたびにイベントハンドラを用意してあげないといけません。
単純ですが、増えれば増えるほどしんどいし、無駄な工数になります。

さて、どうしたものか。。。いろいろ考えました。
行き着いた答えは、「入力チェック機構を持ったバリュークラスを作ってしまえ!」でした。

クラス図で概要を表すと以下のようになります。

f:id:nakasato-work:20161201125559p:plain

考えとしては、

  1. テキストボックスとバインディングするだろうから、string型を窓口にしよう!(Textプロパティ)
  2. 実際の値の型に対する処理はサブクラスに委譲してしまえ!(サブクラス側でしかValueプロパティを持たない)
  3. 文字列なら文字数、数値型なら範囲が単純な入力チェックの処理だよね!共通!(バリュークラスにMin・Maxプロパティを持つ)
  4. リュークラスの中でエラーダイアログを表示させると、後々めんどくさいことになるから、メッセージ表示は上位に委譲してしまえ!(ShowMessageイベントハンドラ)

大体こんな感じです。とりあえず、今回はここまでとします。
次回は、具体的な実装方法を紹介します。