オブジェクト指向にはカプセル化という考え方がある。以前に書いた記事で、Javaのインターフェースについての復習を行ったが、そこでもカプセル化が登場している。
カプセル化とは
オブジェクト指向プログラミングが持つ特徴の一つ。データとそれを操作する手続きを一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽すること。外部からは公開された手続きを利用することでしかデータを操作できないようにすることで、個々のオブジェクトの独立性が高まる。カプセル化を進めることによりオブジェクト内部の仕様変更が外部に影響しなくなり、ソフトウェアの保守性や開発効率が高まり、プログラムの部分的な再利用が容易になる。
上記の「公開された手続き」のうち、「公開された」にあたるのが、Javaでいうインターフェースを指す。 「公開された手続き」のうち、「手続き」にあたるのが、アクセサを指す。
アクセサの役割は、オブジェクト内のデータを操作したい場合にアクセサを利用することでしかデータを操作できないようにすることである。これを行うと、オブジェクトの独立性が高まり、プログラムの部分的な再利用が容易になる。
ここで言う「データ」にあたる変数はprivateで宣言されており、外部から直接の変更を加えることはできない。代わりに変更はアクセサを用いて行う。
アクセサには2つのタイプがあり、データの取得を行うのがgetter(ゲッター)、データの書き換えを行うのがsetter(セッター)と呼ばれる。
Javaでの実装例
public class Fuga { private int foo = 0; public int getFoo(){ return this.foo; } public void setFoo(int f) { if (f < 0) f = 1; this.foo = f; }}
外部から変数fooの取得や書き換えたい場合、変数はprivateで宣言されているので以下のような方法を取らざるを得ない。
Fuga a = new Fuga();a.getFoo();a.setFoo(10);
setFoo()にはマイナスの値が渡されると強制的に変数には1が挿入される。アクセサによってマイナスの値が入ることを防いでいる。メソッドを呼ぶ側では意識せずとも、ちゃんとオブジェクトが適切に処理してくれるのだ。
参考
IT用語辞典