対象読者
- カプセル化をオブジェクト指向特有のものだと勘違いされている方
結論
- 制御プログラムから見えなくする行為は全てカプセル化である
- カプセル化は良いコードを作るための基本である
根拠
以下では、よく見られるカプセル化の説明を見た上で、実はカプセル化はプログラミング全般に見られる技術であることを指摘し、良いコードを作るための基本であることを順に見ていく。
通説のカプセル化
カプセル化とは、
- オブジェクト指向の3大要素の1つであり(他は継承とポリモーフィズム)、
- クラスのメンバ(プロパティやメソッド)をprivateにすることによって、外部からアクセスを制限すること
である。
メリットは
- privateなプロパティへのアクセスをgetter/setter経由にすることで、予期しない上書きを防止できる。
- クラス内にメンバを隠蔽することで、制御プログラムから変数や処理を分離でき、独立性を高めることができる。
などである。
カプセル化はオブジェクト指向限定ではない
別に、カプセル化はオブジェクト指向の専売特許ではない。ローカル変数はグローバル変数を関数スコープ内に隠蔽(カプセル化)したものだ。カプセル化は手続き型プログラミングでも可能である。
隠蔽するならば、何でもカプセル化である。
- 変数はリテラル(“aaa”や999などのベタ書きされた値)を、
- 関数は一連の処理を、
- ポリモーフィズムは具象クラスを
隠蔽する。
カプセル化はよいプログラミングの基本
カプセル化(隠蔽)されたものは、制御プログラムから見えなくなる。つまり、カプセル化された内容を書き換えることによって、制御プログラムは不変のまま、振舞いを変更できるようになる。
例を挙げると、関数は、入力と出力のインターフェース(制御プログラムから見える部分)さえ変更しなければ、
- ローカル変数を増やしたり、
- さらに処理を括りだして別の関数にして、それを呼び出す形に書き換えたり
できる。
カプセル化を推し進め、プログラムを独立した部品に分割していくことで、より柔軟で、低結合、高凝集なプログラミングが実現できるようになる。
参考
- オブジェクト指向のこころ[アラン・シャロウェイ]
- Java言語で学ぶデザインパターン入門[結城 浩作]
コメント