広告
  サイト内検索:
<Let's create a game!> Introduction of programming for absolute beginners English

カプセル化(アクセス権、アクセス権限)
カプセル化(アクセス権、アクセス権限)

アクセス権(アクセス制御):クラスメンバの使用権限
アクセス権

クラスメンバの使用権限。

アクセス権を設定することで
フィールドやメソッドを外部から
使わせるかどうか管理出来る


自動車の例で言うと・・・

自動車が持ってる「状態値」や「機能」を、
運転手に使わせるか・・・


そんな権利のイメージ。
 


アクセス権は、正確には
アクセス制御
と呼ぶのが一般的?


セッションでは分かりやすくするために
アクセス権と呼んで説明します。

  アクセス権の構成

アクセス権の構成

クラスのフィールドやメソッドごとに「権限」を
付けることで細かく権限を管理できる。

アクセス権は必須の項目。
 
アクセス権の構成:各フィールド、メソッドに設定する

  アクセス権の種類

アクセス権の権限は大きく言うと2種類。

パブリック(公開)
プライベート(非公開)

パブリックの場合は、
全ての外部から使用可能。

プライベートの場合は、
クラス(オブジェクト)内部でしか使えなくなる。

(Javaには他のアクセス権もある。)
 
アクセス権の概要:外部からのアクセスを制御する権限。パブリック(公開)、プライベート(非公開)を設定する。

  アクセス権の使い方1


アクセス権の使い方1
 
1、オブジェクトの内容を考える
2、クラスを設計する
3、インスタンスを生成する
4、インスタンスを設定して使う
 

  1、オブジェクトの内容を考える

例:アクセス権を使って「マニュアル車」を
「オートマチック車」に変更する。


クラッチを運転手から隠して、操作できないようにする
(クラッチはあるが操作できない状態にする。)
   
 
アクセス権の使い方:1、オブジェクトの内容を考える。オブジェクトへの外部からのアクセスをどうするか。
 
アクセス権の変更:メソッドをプライベート(非公開)に変更する。

  2、クラスを設計する

今回は、クラッチメソッドのアクセス権を変更する。

運転手が操作していたクラッチを機械で自動化し、
同時に、クラッチのアクセス権をプライベートに変更して、
外部から操作できなくした
イメージ。
 
アクセス権の使い方:2、クラスを設計する。フィールドやメソッドにアクセス権を設定する

  3、インスタンスを生成する

改変したクラスでインスタンスを作る。

オートマチック車の完成。
クラッチが見えなくなり外部からは使えない。
 
アクセス権の使い方:3、インスタンスを生成する。設定したアクセス権のインスタンスが生成される。

  4、インスタンスを設定して使う

作った自動車を使う。

アクセス権を使って運転手がクラッチにアクセス
できないようにして、安全性や安定性が高まった。
 
 
アクセス権の使い方:4、インスタンスを設定して使う。隠蔽することで外部からの不要な操作を防ぎ、安全性・安定性を高める

  アクセス権の使い方2

アクセス権がパブリックになっているものは
「見る」だけじゃなく「使う」こともできる

これが問題になる時がある。

例えば、
フィールドがパブリックの場合、
外部からは「読む」だけじゃなく「書く」こともできる。

公開(使える) = 読み込み・書き込み

読み書き両方になる。

つまり、パブリックにすると
外部には見せるだけで書き込みをさせたくない項目でも、
書き込みしようと思えばできてしまう状態になる


以下の例は、
スピードメーターの針を、冗談で指でぐるぐる回したら
なぜか速度が上がっちゃたイメージ。
アクセス権の使い方2(改良前):フィールドに直接アクセス可能。危険なので外部からのアクセスを制限したい。


これはアクセス権がパブリックだと
外部から「直接」フィールドにアクセスできる
とから起こる問題。

直接書き換えられるのを防げないために起こる。
 
オブジェクトのデータの流れ:フィールドに直接アクセスした場合



問題を解決する

直接がだめだったら、「間接」的にアクセスさせるようにすればいい。

フィールドを「プライベート」に変更して隠して、
外部からはメソッドを通してフィールドにアクセスさせる


メソッドはクラスメンバなので、プライベートのフィールドに
アクセス可能。

これで外部は直接操作できない。
 
 
オブジェクトのデータの流れ:フィールドに間接的にアクセスした場合(メソッドの利用)


例:間接的にアクセスする仕組みを使って、自動車クラスを作り変える。

新しく追加した「スピードメーター」メソッドに注目。
スピードメーター機能で代わりに速度を表示するように変更した。

これには読み込みする機能しか無く、運転手は絶対に書き込みできない。
 
 
アクセス権の使い方2(改良後):フィールドにはメソッドを通じてアクセスさせることで安全に操作できる

  getter(ゲッター)、setter(セッター)

例のように、
フィールドはプライベートにして直接アクセスは禁止する。
外部からは、メソッドを通して間接的にフィールドにアクセスさせる。

こうする事で、メソッドの作り方次第で
フィールドへのアクセスを「読み込みのみ」、「書き込みのみ」に
することができる


このメソッドを通してフィールドを管理する仕組みをプログラムでは、
getter(ゲッター)、setter(セッター)
と言う。
(「プロパティ」と言うのも同じような仕組み。)

名前だけ覚えておいてください。
 
 

フィールドを間接アクセスに変更した手順(getter、setter化)
 
1 フィールドをプライベートにして隠す
2 隠したフィールドの「読み込み」「書き込み」はメソッドが行う。
3 メソッドをパブリックにして外部から利用できるようにする。



さらに、このやり方を発展させて
スピードメーター機能を改良することもできる。

例:スピードメーターメソッドの改良

スピードメーターメソッドは、運転手に速度を表示する前に、
正確な速度に補正してから表示している。

運転手は「結果」の速度を受取るだけ。
難しい速度の補正はスピードメーターにお任せで運転に
集中できる。
 
アクセス権の使い方2(改良後):内部のプロセスに関わらないようにすることで、オブジェクトの役割を明確にする。


フィールドとメソッドの関係

今までの例のように、アクセス権とメソッドを使って、
オブジェクト内部のデータ(フィールド)を管理する


     

ここまでのまとめ

アクセス権は、上手く使うことでクラス間の役割を明確にできる

つまり、オブジェクトの独立性や分離性を高めることができる

つまり・・・
運転手は、「結果」を貰うだけ。運転手は、運転に集中する。
速度表示の管理は全部スピードメーター機能に任せる。

オブジェクトそれぞれの役割分担を明確にできる。
 
 
アクセス権の利点1

  カプセル化

例のように、
アクセス権を使うことでオブジェクトの項目を隠蔽して、
外部との関わりを制御することができる。


これをカプセル化と言う。
 
カプセル化(情報隠蔽)とは:クラス(オブジェクト)に様々なアクセス権限を設定し外部との関わりを制御すること


そして、カプセル化、つまり、アクセス権を使うことで、
オブジェクトのセキュリティを高めたり、クラスの役割を明確にできる。

こうすることで、クラスを部品として作って、部品ごとに交換したりし易くできる。
 

カプセル化(情報隠蔽)の目的1:オブジェクトの動作をアクセス権で安全性・安定性を高める
カプセル化(情報隠蔽)の目的2:クラス(オブジェクト)間の関わりをアクセス権で明確にする

  アクセス権のまとめ

 
アクセス権のまとめ
クラスメンバにアクセス権を設定することで、外部からのオブジェクトへのアクセスを管理する
主なアクセス権には公開(パブリック)と非公開(プライベート)がある
カプセル化と言う
 
 

オブジェクト指向の利点
 
利点 内容
柔軟性 物の組み合わせを変えることで、様々なシステムの設計に対応できる。
再利用性 一度作った物を別のシステムに再利用できる。
応用性 様々なものに当てはめて設計できる。
物体だけじゃなく事象や計画などに適用して考えることも出来る。
独立性 クラスごとに部品化して設計し、機能・役割を分担できる。
分離性 部品化し、内部処理をブラックボックス化することで、他に影響を与えずに交換や追加・変更しやすい構造にできる。
安全性 外部からのアクセスを制限にすることで、安全な構造に設計できる。
効率性 クラスごとに担当者を分け、作業を分担することで平行作業することができる。
・・・ ・・・
 

 
このページはセッションで使用したプログラミング用語やIT用語の要約です。復習に利用して下さい。

漫画形式の本編はこちら 
<ゲームを作ろう!>超初心者のためのプログラミング入門
 

広告
home もくじ
  サイト内検索:
広告
お勧めの姉妹サイト
leafdays - リーフデイズ 超初心者のための園芸入門 - 楽しい趣味のガーデニング -