オブジェクト指向のカプセル化は、データとそのデータを扱う操作を一つのまとまりにし、外部に必要な操作を公開しながら内部の詳細を隠す考え方です。フィールドをprivateにすることだけでなく、どの操作を通じて状態を変えるかが大切です。
この記事では在庫数を例に、直接変更とメソッド経由の変更を比較します。継承・多態性との違い、通信分野で使う同じ用語も整理し、末尾で関連note教材を案内します。
カプセル化でまとめるもの:状態と操作
| 要素 | 在庫を扱うオブジェクトの例 |
|---|---|
| 状態・データ | 商品ごとの在庫数 |
| 公開する操作 | 入庫する、出庫する、現在の在庫数を確認する |
| 内部の詳細 | 在庫数の保存方法や、更新時の検査処理 |
利用する側は「出庫する」という操作を呼び出せればよく、在庫数をどのフィールドやデータ構造で管理しているかまで知る必要がありません。このように、外部との接点と内部の実装を分けます。
具体例:在庫数を負にしない
在庫数が10個のとき、外部から直接「在庫数=−5」と書き換えられると、守りたいルールが崩れます。そこで内部の在庫数への直接変更を制限し、入出庫の操作を通じて更新します。
| 操作 | 確認する条件 | 結果の例 |
|---|---|---|
| 出庫する(3) | 数量が正で、現在の在庫数以下かを確認 | 在庫10から7へ更新 |
| 出庫する(12) | 在庫10では足りない | 操作を受け付けず、在庫10を維持 |
| 出庫する(−2) | 数量が正ではない | 操作を受け付けず、在庫を維持 |
ここで守りたい「在庫数が負にならない」という条件が、不変条件の例です。公開する各操作が条件を保つように設計します。この例は考え方を示すもので、実装では同時更新やエラー処理なども別に考慮します。
ゲッター・セッターを作るだけで十分?
すべてのフィールドに無条件のセッターを作ればよい、という意味ではありません。例えばsetStock(−5)をそのまま許可すれば、直接代入と同じ問題が残ります。必要な操作だけを公開し、値や状態の条件を確認することが重要です。
読み取り用のゲッターも、内部の変更可能なリストなどをそのまま返すと、外部から内容を変更される場合があります。公開する情報と、その情報を通じて何ができるかを考えます。具体的な制御方法は言語や型の仕様によって異なります。
情報隠蔽と保守性の関係
内部で単純な数値を持つ実装から、別の管理方法へ変更しても、公開操作の意味や約束を維持できれば、利用側への影響を小さくできます。ただし、メソッド名が同じなら何を変えても影響がない、とは限りません。戻り値・例外・動作の意味などの契約も関係します。
アクセス制御や情報隠蔽は、誤った使い方を減らし変更の影響を抑える設計に役立ちます。一方、privateを付ければ暗号化や利用者認証も実現する、という意味ではありません。ここでのデータ保護は、主にプログラム内の操作の制御を指します。
継承・多態性とはどこが違う?
| 概念 | 着目すること |
|---|---|
| カプセル化 | 状態と操作をまとめ、外部に公開する接点と内部を分ける |
| 継承 | 既存のクラスの性質や動作を引き継ぎ、クラス間の関係を表す |
| 多態性(ポリモーフィズム) | 共通の操作を使っても、対象の型などに応じて異なる動作をする |
カプセル化はクラス階層を作ることそのものではありません。継承を使わないクラスでも、状態と公開操作を適切に設計してカプセル化できます。
通信分野の「カプセル化」との違い
ネットワークでは、ある層のデータを次の層のデータ部分として扱い、ヘッダーなどを付加することをカプセル化と呼びます。例えばTCPの情報を付け、IPの情報を付け、さらにデータリンク層のフレームとして運ぶ、といった流れです。方式によってトレーラーも付加されます。
こちらは通信プロトコルの階層間でデータを包む処理です。オブジェクト指向のアクセス制御と同じ仕組みではなく、カプセル化そのものが暗号化を意味するわけでもありません。問題文がプログラミングか通信かを先に確認しましょう。
確認問題:セッターがあればカプセル化は十分?
在庫数フィールドをprivateにし、公開メソッドsetStockで任意の整数を検査せず代入できるようにしました。これだけで「在庫数を負にしない」という条件を守れるでしょうか?
解答・解説を見る
守れません。setStock(−5)などで不正な状態にできるためです。必要な操作を絞り、値と現在の状態を検査して更新するように設計します。privateは直接アクセスを制限する手段であり、公開メソッドの振る舞いまで自動で正しくするものではありません。
次はnoteでオブジェクト指向全体を整理
カプセル化の役割が分かったら、関連noteでクラスとインスタンス、継承、多態性などをつなげて復習できます。リンク先ではカプセル化や情報隠蔽の説明に加え、オーバーライド・オーバーロードなども扱っています。本記事の在庫の例を押さえ、用語同士の違いを確認しましょう。
教材の公開範囲・価格はnoteの表示をご確認ください。ほかの教材は著者のnote一覧から探せます。
まとめ
カプセル化はデータと操作をまとめ、必要な接点を公開して内部を隠す設計です。単にゲッター・セッターを用意するだけでなく、公開操作を通じて守るべき条件を維持することが大切です。通信分野の同じ用語とは文脈を分けて理解しましょう。
参考:Oracle Java Tutorials:What Is an Object?(英語)。在庫の例と確認問題は本記事のオリジナルです。


コメント