別記事にコメントした内容ですが、せっかくなので記事化しておきます。
カプセル化
アクセス制限することだけがカプセル化ではありません。
なんでもかんでもsetter/getterにするとカプセル化を破壊します。
一般的に「~化」は「~にすること」。
「記事化」は「記事にすること」。
「日本語化」は「日本語にすること」。
「カプセル化」は「カプセルにすること」。
- 薬のカプセルは、「発熱、鼻水・鼻づまり、頭痛を緩和するために1日3回食後に2錠服用する総合感冒薬」のように、薬効成分をまとめて用途・用法・用量・使用条件を明確にし、効能・効果・目的が明確な名前を付けたもの。
- ソフトウェアのカプセルは、データと操作をまとめて用法(API)や制限を明確にし、責務・用途・目的が明確な名前を付けたもの。
- カプセル内の成分(データ)や仕組み(処理ロジック)は気にせずに、目的を容易に達成できるようにするのがカプセル化。
- カプセルの内容を勝手に変えると効果が変わるのでカプセルでガード。無理矢理中身を変えて効果・効能・結果が変わったら使用者の責任。
- JavaScriptやPythonの言語仕様にガード(アクセス制限)機能がないけれど、命名ルールなどで使用者にガードさせるのもあり。
- ガード(アクセス制限)することだけがカプセル化の目的ではない。
- 内部の情報・複雑な構造・プロトコルなどを隠し、外部から簡単に安全に扱えるようにするのが目的。
たとえば、「通信カプセル」は通信プロトコルやヘッダ形式を知らなくても使えるようにしたもの。
参考: http://e-words.jp/w/カプセル化.html
「徹底攻略 Java SE 11 Silver 問題集」には次のように書いてあるそうです:
カプセル化は、ソフトウェアを分割する際に、関係するデータとそのデータを必要する処理を1つにまとめ、無関係なものや関係性の低いものをクラスから排除することで「何のためのクラスなのか?」というクラスの目的を明確化するために行い、ほかのクラスに重複するデータや処理がない状態を目指すものです。
ポリモーフィズム(多態性)
サブクラスにすることだけがポリモーフィズムではありません。
使用例:「再生」ボタンを押すと、MP3プレイヤーならMP3ファイルを読み込んで音楽が再生されるし、DVDプレイヤーならDVD媒体が回転して映像と音(セリフや効果音)が再生される。
- 同じ命令でもオブジェクトによって異なる振る舞いをするのがポリモーフィズム。
- 違う振る舞いをするけど、同じ操作インタフェースで使えるので便利。
- 新しい製品が発売されても同じように使える。
- 使える物のバリエーションが増える。
- 使う側は苦労しない。負担軽減。
DVDプレイヤーの前面には操作インタフェースがあり、背面には接続インタフェースがある。
「再生」は操作インタフェースのひとつ。
違う装置でも共通インタフェースを持つことで統一的に扱えるようになる。ポリモーフィズムの恩恵。
目的
- 使う側の軽減負担、コード削減、省力化
- 使われる側を簡単に入れ替えられ、柔軟性向上
- 抽象クラス/インタフェースを使うことで依存性を断つ、独立性向上
手法
- 目的が同じなら同じ名前(抽象名)を付ける
- 共通インタフェースを定義する
実装手段
- 共通インターフェスを定義して、オブジェクト毎に実装を変える
- サブクラスにして、メソッドオーバライドして実装を変える
- メソッドオーバーロードして、同じメソッド名でも引数の型に応じて実装を変える
参考記事
もっと詳しく知りたい方は以下の記事がお勧めです。