カプセル化とは何か?

現在のカリキュラムでは、

  • クラスとオブジェクト
  • メソッド
  • static
  • 値型と参照型
  • List
  • LINQ
  • Windowsフォームのイベント処理

まで進みました。

つまり皆さんは、

「クラスは書ける」段階です。

次の段階は何か?

それが カプセル化 です。


カプセル化とは?

一言で言うと:

データを勝手に壊されないように守る設計

です。


まずは守らないコード

class Player
{
    public int HP;
}
Player p = new Player();
p.HP = -1000;
Console.WriteLine(p.HP);

何が問題でしょうか?

  • HPがマイナスになる
  • ルールがない
  • 誰でも自由に変更できる

これは「無防備な状態」です。


第1段階:メソッドで守る

まずは皆さんがすでに理解している

メソッド で守ってみましょう。

class Player
{
    private int hp;

    public void SetHP(int value)
    {
        if (value < 0)
        {
            hp = 0;
        }
        else
        {
            hp = value;
        }
    }

    public int GetHP()
    {
        return hp;
    }
}

使用側:

Player p = new Player();
p.SetHP(-1000);
Console.WriteLine(p.GetHP());

ここで何が起きていますか?

  • hpは直接触れない
  • 必ずルールを通る
  • データが守られる

これがカプセル化の第一歩です。


第2段階:C#ではプロパティを使う

C#では、上記をより自然に書ける仕組みがあります。

それが プロパティ です。

class Player
{
    private int hp;

    public int HP
    {
        get
        {
            return hp;
        }
        set
        {
            if (value < 0)
            {
                hp = 0;
            }
            else
            {
                hp = value;
            }
        }
    }
}

使用側:

Player p = new Player();
p.HP = -1000;
Console.WriteLine(p.HP);

見た目は普通の変数のようですが、

内部では必ずルールが実行されています。


なぜ今やるのか?

皆さんは今、

  • Listにクラスを入れている
  • イベントから値を受け取っている
  • 外部入力が増えている

という状態です。

外部入力は危険です。

  • 空文字
  • 数値変換失敗
  • 想定外の値
  • マイナス値

これを防ぐのがカプセル化です。


カプセル化しないとどうなるか

例:消費税計算アプリ

public int Price;

イベントから直接代入。

もし負の値が入ったら?

UIは正常でも、内部は壊れます。

規模が大きくなるほど、

「どこで壊れたか分からない」

という状態になります。


カプセル化は設計力

初心者の考え:

とりあえず動けばいい

中級者の考え:

壊れない構造を作る

この差が設計力の差です。


今後の発展

カプセル化を理解すると、

  • get private / set private
  • コンストラクタ初期化
  • 不変オブジェクト
  • 継承時の安全設計
  • Unityでの状態管理

に繋がります。


まとめ

カプセル化とは:

  • データを守る
  • ルールを内部に持つ
  • 外部からの不正を防ぐ
  • 責任範囲を明確にする

皆さんは今、

「クラスが書ける段階」から

「クラスを設計する段階」

へ進んでいます。

ここが分かれ道です。


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

記事下広告