カプセル化(アクセス権、アクセス権限) |
 |
|
|
|
|
|
|
|
|
 |
 |
|
|
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
アクセス権
クラスメンバの使用権限。
アクセス権を設定することで
フィールドやメソッドを外部から
使わせるかどうか管理出来る。
自動車の例で言うと・・・
自動車が持ってる「状態値」や「機能」を、
運転手に使わせるか・・・
そんな権利のイメージ。
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
アクセス権は、正確には
アクセス制御と呼ぶのが一般的?
セッションでは分かりやすくするために
アクセス権と呼んで説明します。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
アクセス権の構成
クラスのフィールドやメソッドごとに「権限」を
付けることで細かく権限を管理できる。
アクセス権は必須の項目。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
アクセス権の権限は大きく言うと2種類。
パブリック(公開)とプライベート(非公開)。
パブリックの場合は、
全ての外部から使用可能。
プライベートの場合は、
クラス(オブジェクト)内部でしか使えなくなる。
(Javaには他のアクセス権もある。)
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
 |
|
 |
|
アクセス権の使い方1 |
|
1、オブジェクトの内容を考える |
2、クラスを設計する |
3、インスタンスを生成する |
4、インスタンスを設定して使う |
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
例:アクセス権を使って「マニュアル車」を
「オートマチック車」に変更する。
クラッチを運転手から隠して、操作できないようにする。
(クラッチはあるが操作できない状態にする。) |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
今回は、クラッチメソッドのアクセス権を変更する。
運転手が操作していたクラッチを機械で自動化し、
同時に、クラッチのアクセス権をプライベートに変更して、
外部から操作できなくしたイメージ。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
改変したクラスでインスタンスを作る。
オートマチック車の完成。
クラッチが見えなくなり外部からは使えない。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
作った自動車を使う。
アクセス権を使って運転手がクラッチにアクセス
できないようにして、安全性や安定性が高まった。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
アクセス権がパブリックになっているものは
「見る」だけじゃなく「使う」こともできる。
これが問題になる時がある。
例えば、
フィールドがパブリックの場合、
外部からは「読む」だけじゃなく「書く」こともできる。
公開(使える) = 読み込み・書き込み
読み書き両方になる。
つまり、パブリックにすると
外部には見せるだけで書き込みをさせたくない項目でも、
書き込みしようと思えばできてしまう状態になる。
以下の例は、
スピードメーターの針を、冗談で指でぐるぐる回したら
なぜか速度が上がっちゃたイメージ。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
これはアクセス権がパブリックだと、
外部から「直接」フィールドにアクセスできる
ことから起こる問題。
直接書き換えられるのを防げないために起こる。
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
問題を解決する
直接がだめだったら、「間接」的にアクセスさせるようにすればいい。
フィールドを「プライベート」に変更して隠して、
外部からはメソッドを通してフィールドにアクセスさせる。
メソッドはクラスメンバなので、プライベートのフィールドに
アクセス可能。
これで外部は直接操作できない。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
例:間接的にアクセスする仕組みを使って、自動車クラスを作り変える。
新しく追加した「スピードメーター」メソッドに注目。
スピードメーター機能で代わりに速度を表示するように変更した。
これには読み込みする機能しか無く、運転手は絶対に書き込みできない。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
getter(ゲッター)、setter(セッター) |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
例のように、
フィールドはプライベートにして直接アクセスは禁止する。
外部からは、メソッドを通して間接的にフィールドにアクセスさせる。
こうする事で、メソッドの作り方次第で
フィールドへのアクセスを「読み込みのみ」、「書き込みのみ」に
することができる。
このメソッドを通してフィールドを管理する仕組みをプログラムでは、
getter(ゲッター)、setter(セッター)と言う。
(「プロパティ」と言うのも同じような仕組み。)
名前だけ覚えておいてください。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
フィールドを間接アクセスに変更した手順(getter、setter化) |
|
1 |
フィールドをプライベートにして隠す |
2 |
隠したフィールドの「読み込み」「書き込み」はメソッドが行う。 |
3 |
メソッドをパブリックにして外部から利用できるようにする。 |
|
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
さらに、このやり方を発展させて
スピードメーター機能を改良することもできる。
例:スピードメーターメソッドの改良
スピードメーターメソッドは、運転手に速度を表示する前に、
正確な速度に補正してから表示している。
運転手は「結果」の速度を受取るだけ。
難しい速度の補正はスピードメーターにお任せで運転に
集中できる。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
フィールドとメソッドの関係
今までの例のように、アクセス権とメソッドを使って、
オブジェクト内部のデータ(フィールド)を管理する。
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
ここまでのまとめ
アクセス権は、上手く使うことでクラス間の役割を明確にできる。
つまり、オブジェクトの独立性や分離性を高めることができる。
つまり・・・
運転手は、「結果」を貰うだけ。運転手は、運転に集中する。
速度表示の管理は全部スピードメーター機能に任せる。
オブジェクトそれぞれの役割分担を明確にできる。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
例のように、
アクセス権を使うことでオブジェクトの項目を隠蔽して、
外部との関わりを制御することができる。
これをカプセル化と言う。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
そして、カプセル化、つまり、アクセス権を使うことで、
オブジェクトのセキュリティを高めたり、クラスの役割を明確にできる。
こうすることで、クラスを部品として作って、部品ごとに交換したりし易くできる。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
|
アクセス権のまとめ |
クラスメンバにアクセス権を設定することで、外部からのオブジェクトへのアクセスを管理する |
主なアクセス権には公開(パブリック)と非公開(プライベート)がある |
カプセル化と言う |
|
|
|
|
 |
|
 |
|
|
 |
|
 |
|
オブジェクト指向の利点 |
|
利点 |
内容 |
柔軟性 |
物の組み合わせを変えることで、様々なシステムの設計に対応できる。 |
再利用性 |
一度作った物を別のシステムに再利用できる。 |
応用性 |
様々なものに当てはめて設計できる。
物体だけじゃなく事象や計画などに適用して考えることも出来る。 |
独立性 |
クラスごとに部品化して設計し、機能・役割を分担できる。 |
分離性 |
部品化し、内部処理をブラックボックス化することで、他に影響を与えずに交換や追加・変更しやすい構造にできる。 |
安全性 |
外部からのアクセスを制限にすることで、安全な構造に設計できる。 |
効率性 |
クラスごとに担当者を分け、作業を分担することで平行作業することができる。 |
・・・ |
・・・ |
|
|
|
|
|
 |
|
 |
|
|