検索
(2006/09/05)
オブジェクト指向においてカプセル化は重要な概念です。
そして決して難しくありません。大切なのは思いやり(?)です。
1つ1つのクラスを確実にカプセル化しておくことで、大規模、複雑になっても安心してシステムを組み立てることができます。
カプセル化の完成度が高くなることは、もの(オブジェクト)としてイメージが明確になるということです。 全てをものとして扱おうとするオブジェクト指向にとって、カプセル化は要となるポイントです。
カプセル化が大切なのはソフトウェアもハードウェアも同じです。 そしてカプセル化はハードウェアの方がイメージしやすく、身の回りでも当たり前のことになっています。
カプセル化のポイントはこんな感じです。
これを読んでいる人の右手にはおそらくマウスがあるのではないでしょうか?
このマウス1つとっても、
ボタンは数個しかなく(⇒使いやすい)、コードは絶縁されており(⇒安全)、奥に動かすとマウスポインタは上に移動します(⇒イメージしやすく)。
ボタンが山ほどあると、何が何だかわからず使いにくい。コードがむき出したと壊れやすく、ビリッとくるかも。マウスを奥に動かしてポインタが左に動いたら混乱します。
当たり前じゃん。。と思うでしょうが、その通り!当たり前の事に「カプセル化」という名前が付いてしまっているのです。 この当たり前のことを1つ1つおさえることで、安全で使いやすい「もの」ができます。
電化製品にしても、ユーザーが物を動作させるために必要なものだけさわれるようにして、不要なものはさわれないようになっています。
カプセル化というと、「隠蔽」がクローズアップされますが、ハードを使う人の立場に立って、
「ユーザーが使いやすい(困惑しない)インターフェースを提供する」
と考えると、自然と不要なものは隠し、使いやすくわかり易いインターフェースのみを公開するようになるでしょう。
ハードウェアでいうとカプセル化はどういうことかはわかったと思います。 それではオブジェクト指向でのカプセル化とはどういうことでしょうか。
結論からいうと、本質的にはハードウェアと変わりません。触らせる/触らせない、見せる/見せない、つまりメソッド・プロパティのアクセス制御そのものです。
ありがちですが、イメージは次のようになります。
![]() |
![]() |
| カプセル化イメージ | クラス図例 |
ただ、プログラムで書くと public/private の違い、UML記述でも +/- の違いしかありません。
画面上のこれらの記述に惑わされず、public と private は全く別物として考え、そのクラスの「もの」のイメージを頭で思い描きましょう。
どうすればカプセル化できるか。 それは何より「ユーザーが使いやすい(困惑しない)インターフェースを提供する」ことです。
全てを隠蔽しては何もできません。ユーザーの立場に立ってユーザーがわかりやすいよう使いやすいようにpublicを用意します(思いやり)。
・・・これで終わりです。残りは全て隠蔽します。
⇒ とにかくpublicを先に検討・決定します。privateはプライベートなことなので・・
カプセル化は、常に身の回りのハードウェアと対比させてみることで自然と身についていきます。
※クラス・メソッド・プロパティの名称も大変重要です
カプセル化のサンプルとなるプログラムはこちらをご覧下さい。