ふみぽん's diary

技術的な備忘録が主のブログ

オブジェクト指向〜カプセル化〜

オブジェクト指向カプセル化について

(現時点でわかっていることを書く)

 

カプセル化の意義

「他のクラスによって影響を受けてはいけない変数を扱うときの隠すための仕組み」

 

 

 

あるクラスについてカプセル化する

必要があるのかどうかを考える際に必要なこと

 

例)Carクラス

f:id:fumipow2317:20191006001714j:plain

 

①:Carクラスの外部からthis.fuelなどの方法でプロパティの値を取得する

②:アクセサメソッド(getter)を使ってプロパティの値を取得する

 

考慮する点:変更箇所

Carクラスのプロパティfuelの型がintからStringに変更になると

①の場合、取得値の型が変更になるので以下のような型修正をする必要がある。

変更前:int fuel = this.fuel

変更後:String fuel = this.String

この取得箇所が1000箇所あれば1000箇所の修正となる。

 

でも、

②の場合、アクセサメソッドの中でint型からString型に変換するメソッドとすれば

Carクラスが変更になっても「取得」する外部のクラスは関係ない!

もう少し詳しく書くと、型変換なんてアクセサメソッド(カプセルの中)で吸収して

解決するから外部のクラスは関係ない!

これぞ、カプセル化

 

つまり、

変数の型などクラスの変更が発生する可能性があるクラスであればカプセル化して

修正時の影響範囲を狭めることができる。

あるクラスのプロパティの型がなんであろうとカプセル化すればアクセサメソッドで

プロパティの型と取得側の求める返却値の型の違いを吸収することができる

 

今回の例だけで言えば、

・Carクラスのプロパティは変更の可能性ない+「取得」の箇所は数カ所

【プロパティとして扱ってもいいかも】

 

・Carクラスのプロパティの変更の可能性ある+「取得」の箇所が膨大

【Carクラスカプセル化してアクセサメソッド経由でプロパティ扱おう】

 

 

また、わかったことがあれば書きます。。