【かぷせるか】

カプセル化 とは?

最終更新:
💡 状態と処理をまとめ、触れる入口を設計する

オブジェクトの状態と処理をまとめ、外部に公開する操作を設計すること。内部のデータを直接変更させず、決めた窓口で値の検証などを行えるようにする。

📌 このページのポイント
内部の状態は、公開した操作で扱う User クラス 内部の状態 private age = 12 ↑ 検証してから変更 公開する操作 setAge(value) 利用側 アプリ 呼び出す 例:0以上か確かめ、不正な年齢を拒否する 公開する形と、約束した動作の両方を保つ
Userクラスの年齢を検証付きで変更する例。右からの矢印は公開メソッドの呼び出し。すべてのデータにsetterが必要なわけではない。
ひよこ ひよこ
カプセル化って何で必要なの?
ペンギン先生 ペンギン先生
データを誰でも直接変えられると、不正な状態を作りやすいからだよ。例えば年齢を直接書き換えられると、-100という値も入れられる。変更の窓口を用意して0以上か検証すれば、その操作から不正な値が入るのを防げるんだ。
ひよこ ひよこ
getterとsetterって何?
ペンギン先生 ペンギン先生
値を読む操作がgetter、設定する操作がsetterだよ。例えばgetAge()で読み、setAge(value)で設定する。ただしsetterを作っただけで検証されるわけではない。値をそのまま代入するだけなら、不正な値も通ってしまうんだ。
ひよこ ひよこ
全部のデータにgetterとsetterを作ればいい?
ペンギン先生 ペンギン先生
必要な操作だけ公開しよう。読めるけれど外から変更できないプロパティも作れるし、残高を直接設定する代わりに入金・出金という操作を用意する設計もある。外にどんな操作を許すかが大切で、すべてに読み書きの入口を作る必要はないよ。
ひよこ ひよこ
内部を変えても、使う側は何も直さなくていい?
ペンギン先生 ペンギン先生
実装を隠す情報隠蔽は、変更の影響を抑える助けになるよ。でも公開メソッドの名前が同じでも、返す値の意味やエラーの条件が変われば使う側に影響する。公開する形だけでなく、約束した動作を保てているかも確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カプセル化」って出てきたら「状態と処理をまとめ、決めた窓口で扱えるようにする設計」と思えればだいたいOK!
📖 おまけ:英語の意味
「Encapsulation」 = カプセルに入れること・封じ込め
💬 薬のカプセルが中身を包むように、内部の状態を包み、外に公開する操作を決めるイメージだよ

参考資料

← 用語集にもどる