こんにちは。
現場での作業で新規APIを作成している際、ふとカプセル化のイメージがつかなくなったので再度調べなおしました。
ネットや書籍で調べてみるとカプセル化とは「オブジェクトに対するアクセス方法を限定して、オブジェクト内部の処理や情報を外部から隠すプログラミング技法」とありました。
上記の文章だけではいまいちピンとこなかったのですが自動販売機に例えると解釈しやすいと思いました。
自動販売機は購入者がお金を入れてほしい商品のボタンを押すことによって商品が出てきます。この一連の動作を適当なソースコードにすると以下になります。
public class vendingMachine { int money = 100; public void insertCoin(money){ // 投入された金額を機械が数える処理 } public void pushButton(){ // ボタン押下された商品を機械が取り出し口に出す処理 } }
お金を入れて好きな商品を選んでボタンを押せば自動販売機がどんな処理をしているのかを知らなくても自動販売機が使えます。
実はこの自動販売機の処理は以下のような作りになっていました。
public class vendingMachine { int money = 100; public void insertCoin(money){ // 投入された金額を小さなおじさんがそろばんで数える処理 } public void pushButton(){ // ボタン押下された商品を小さなおじさんが運び取り出し口に出す処理 } }
自動販売機の中身が機械が制御していようが小さなおじさんが制御していようがお金を入れて押したものが出てくれば購入者からは関係のない話です。
つまり中の実装は異なっていてもメソッドの引数と戻り値は同じです。
カプセル化を使いことによって以下のようなメリットもあると考えます。
先ほどの自動販売機がグレードアップし商品を購入するとおまけがつくようになりました。
public class vendingMachine2 { int money = 100; public void insertCoin(money){ // 投入された金額を機械が数える処理 } public void pushButton(){ // ボタン押下された商品を機械が取り出し口に出す処理 // 取り出し口におまけも出す処理 } }
上記のコードからもわかるように使う人はお金を入れて欲しい商品を選ぶという動作だけを知っていればアップグレードされた自動販売機を従来通りに使用することができます。
少しでもカプセル化のイメージがわかない人にイメージがわいたらうれしいです。