##前提として
本記事は私自身の備忘録として執筆しています。
ですので間違っていたらご指摘いただけますと幸いです。
少々わかりにくい部分や表現がありますことをご了承ください。
※そもそもカプセル化という言葉自体、抽象的な言葉で本記事では実際にprivateを使ったケーススタディを紹介しています。
##イメージ
まず「カプセル化のイメージ」について
・何かに包まれている
・外から守られている
・カプセル化を崩すとあまりよろしくない 等
こちらが私が最初に聞いた時のイメージです。
結論から言うと、これらは概ね正解と言えるでしょう。
##どこから守るのか
カプセル化についてはオブジェクのデータやメソッドについて使われることが多いようです。
一言で言うと「オブジェクト内にあるデータ」を外部からの不正アクセスから守ると言うことになります。
すごく簡単に言い換えるとこうです。
「そのオブジェクトやメソッドに対する外からのデータアクセスを拒否する」
と言うことです。
##なぜ守るのか(カプセル化の必要性)
目的は大きく分けて2つです。
・外部から不正なアクセスから守る
・外部から意図しない変更をさせない
これらより、カプセル化を実装しないとコードの保守や可読性が落ちてしまい、予期せぬエラーやコンパイルが通らないことも起こり得ます。
また、後でコードに微修正を加えたい場合にも思わぬところで時間を取られてしまい生産性が低下しますのでチームで開発する場合は必ず実装しなければなりません。
##ではどのようにしてカプセル化するのか
実装については簡単です。
データアクセスを制限すればよいのでその言語に使われる「アクセス修飾子」を用います。
※アクセス修飾子についてはこちらを参考
しかしこれらの修飾子全てをカプセル化に使うということではありません。
基本的にはこの中でも「private」を使います。そりゃそうですよね。アクセスを制限するのですから。。
privateを使うことでclassなど宣言内でしかアクセスできなくなります。
###余談
これらのカプセル化をちゃんと実装していて、
他の人がコードを読み”カプセル化されていないオブジェクト”を発見すると、
「あ!このオブジェクトは外部から変更が加わるものなんだな」と言うことが一瞬でわかります。
###追記
僕自身カプセル化の知識についてまだまだ勉強不足だったところがあり、
厳密いうとこれがカプセル化の全てではありません。しかし言葉のイメージとして伝わっていただけますと幸いです。