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

現在の学習段階では、

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

まで進んでいます  

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

今日のテーマは、

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

という話です。


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

カプセル化とは、

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

のことでした。


カプセル化されていない例

消費税計算機を考えます。

int price = int.Parse(textBox1.Text);

問題は何でしょう?

  • 空文字で例外
  • 数字以外で例外
  • マイナス値も入る
  • 桁数オーバーもあり得る

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

これは危険です。


NumericUpDownはなぜ安全か

decimal price = numericUpDown1.Value;

NumericUpDownには、

  • Minimum(最小値)
  • Maximum(最大値)
  • 型保証(decimal)
  • 不正入力防止

が最初から組み込まれています。

つまり、

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

のです。

これはまさにカプセル化です。


WinFormsコントロールの構造

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

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

で構成されています。

例:

button1.Enabled = false;

内部状態は直接触れません。

Enabled というプロパティ経由のみ変更できます。

これがカプセル化です。


TextBoxはなぜ弱いのか

textBox1.Text

→ 何でも入力できる。

つまり、

入力の責任がプログラマー側にある

のです。


設計の強さを比較

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

この違いが、

カプセル化の強さの違い

です。


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

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

class Price
{
    private int value;

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

UI側:

Price price = new Price();
price.Value = int.Parse(textBox1.Text);

UIが壊れても、

クラスが守ります。

これが、

UIとドメインの責任分離

です。


なぜ今これが重要か

皆さんは今、

  • オブジェクトをListで扱い
  • Windowsフォームでイベントを使い
  • 外部入力を受け取っている

段階にいます。

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

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


プロの設計思想

初心者:

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

中級者:

クラスで守る

上級者:

UIは信用しない

WinFormsは、

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

です。

それを観察することが、

設計力向上への近道です。


まとめ

WinFormsは、

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

カプセル化の実例です。

今は、

「クラスを書く段階」から

「クラスを守る段階」へ進むタイミングです。


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