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は、
- データを内部に持ち
- ルールを内部に持ち
- 安全な窓口だけ公開する
カプセル化の実例です。






ディスカッション
コメント一覧
まだ、コメントがありません