WinForms × カプセル化(UIから設計力を学ぶ)

広告

現在の学習段階では、

  • クラスとオブジェクト
  • メソッド
  • static
  • 値型と参照型
  • List
  • Windowsフォームアプリ

まで進みました。

実際、2月下旬には

  • Windowsアプリのハローワールド
  • 消費税計算機
  • TryParseによる入力チェック

まで扱っています  

つまり皆さんは、

「UIを作れる」段階に来ています。

ここから一段レベルを上げます。

今日のテーマは

WinFormsはカプセル化の実例そのもの

という話です。


カプセル化とは何か(復習)

カプセル化とは、

データを直接触らせず、ルールを通して扱わせる設計

のことでした。


Step1:HelloWorld(まだ安全性は意識しない)

private void HelloButtonClicked(object sender, EventArgs e)
{
    this.helloLabel.Text = "Hello, World!";
}

ここでは単純に

  • ボタンを押す
  • ラベルが変わる

というイベントの仕組みだけを扱っています。

まだ「守る」という概念は出てきません。


Step2:TextBox版(壊れる設計)

次に、TextBoxから数値を受け取り倍にして表示する処理を書きます。

private void HelloButtonClicked(object sender, EventArgs e)
{
    int number = int.Parse(textBox1.Text);
    helloLabel.Text = (number * 2).ToString();
}

ここで問題を起こしてみます。

  • 空文字
  • abc
  • -100
  • とても大きな値

結果はどうなるでしょうか?

例外が発生します。

なぜか?

TextBoxは「何でも入力できる」からです。

UIから「むき出しのデータ」が入ってきます。

これは危険です。


Step3:TryParse(UIで守る)

そこで登場するのが TryParse です。

private void HelloButtonClicked(object sender, EventArgs e)
{
    if (int.TryParse(textBox1.Text, out int number))
    {
        helloLabel.Text = (number * 2).ToString();
    }
    else
    {
        MessageBox.Show("数値を入力してください");
    }
}

ここで私たちは、

UIで守る

という対策をしました。

これは良い一歩です。

しかし、まだ設計としては「弱い」です。


Step4:NumericUpDownに変更する

次に、TextBoxを NumericUpDown に変更します。

private void HelloButtonClicked(object sender, EventArgs e)
{
    int number = (int)numericUpDown1.Value;
    helloLabel.Text = (number * 2).ToString();
}

TryParseが消えました。

なぜでしょう?

NumericUpDownには最初から

  • 数値しか入らない
  • 型保証(decimal)
  • Minimum / Maximum 制限
  • 不正入力防止

が組み込まれています。

つまり、

内部でルールを持っている

のです。

これがカプセル化です。


WinFormsコントロールの構造

実は、WinFormsのコントロールはすべて

  • フィールド(内部データ)
  • プロパティ(安全な窓口)
  • イベント(外部通知)

で構成されています。

例:

button1.Enabled = false;

内部状態を直接触ることはできません。

必ずプロパティ経由です。

これが

カプセル化された設計

です。

WinFormsは、

「完成されたカプセル化クラスの集合体」

なのです。


さらに一段上:UIを信用しない設計

本当に強い設計はこうです。

class Number
{
    private int value;

    public int Value
    {
        get => value;
        set
        {
            if (value < 0)
                this.value = 0;
            else
                this.value = value;
        }
    }
}

UI側:

private void HelloButtonClicked(object sender, EventArgs e)
{
    Number n = new Number();
    n.Value = (int)numericUpDown1.Value;

    helloLabel.Text = (n.Value * 2).ToString();
}

ここで重要なのは、

UIが壊れてもクラスが守る

という発想です。

これは

  • UI層
  • ドメイン層

の責任分離です。


設計の強さを比較

コントロール設計の強さ
TextBox弱い(自由入力)
NumericUpDown強い(数値制限)
ComboBox強い(選択制限)
CheckBox強い(bool保証)

この違いが、

カプセル化の強さの違い

です。


なぜ今これが重要か

今は、

  • Listでオブジェクトを扱い
  • 参照型と値型を理解し
  • イベントを使い
  • 外部入力を扱っている

段階です  

この状態でカプセル化を理解しないと、

アプリは簡単に壊れます。


プロの設計思想

初心者:

画面でチェックすればいい

中級者:

クラスで守る

上級者:

UIは信用しない

この違いが、

「動くコード」と「壊れない設計」の差です。


まとめ

WinFormsは、

  • データを内部に持ち
  • ルールを内部に持ち
  • 安全な窓口だけ公開する

カプセル化の実例です。

訪問数 2 回, 今日の訪問数 2回

広告