技術の犬小屋

Webプログラミングを餌に生きる犬のメモ帳

オブジェクト指向にはカプセル化という考え方がある。以前に書いた記事で、Javaのインターフェースについての復習を行ったが、そこでもカプセル化が登場している。
 

カプセル化とは

オブジェクト指向プログラミングが持つ特徴の一つ。データとそれを操作する手続きを一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽すること。外部からは公開された手続きを利用することでしかデータを操作できないようにすることで、個々のオブジェクトの独立性が高まる。カプセル化を進めることによりオブジェクト内部の仕様変更が外部に影響しなくなり、ソフトウェアの保守性や開発効率が高まり、プログラムの部分的な再利用が容易になる。
 
>外部からは公開された手続きを利用すること
 
「公開された手続き」のうち、「公開された」にあたるのが、Javaでいうインターフェースを指す。
 
「公開された手続き」のうち、「手続き」にあたるのが、アクセサを指す。
 
アクセサの役割は、オブジェクト内のデータを操作したい場合にアクセサを利用することでしかデータを操作できないようにすることである。これを行うと、オブジェクトの独立性が高まり、プログラムの部分的な再利用が容易になる。
 
ここで言う「データ」にあたる変数はprivateで宣言されており、外部から直接の変更を加えることはできない。代わりに変更はアクセサを用いて行う。
 
アクセサには2つのタイプがあり、データの取得を行うのがgetter(ゲッター)、データの書き換えを行うのがsetter(セッター)と呼ばれる。
 
以下はJavaでの実装例。
 

package hoge;
public class fuga {
    private int foo = 0;
    private int bar = 0;

    public int getFoo(){
        return this.foo;
    }
    public int getBar(){
        return this.bar;
    }

    public void setFoobar(int f, int b) {
        if (f < 0) f = 1;
        if (b < 0) b = 1;
        this.foo = f;
        this.bar = b;
    }
}

 
外部から変数foo,barの取得や書き換えたい場合、変数はprivateで宣言されているので以下のような方法を取らざるを得ない。
 

fuga a = new fuga();
a.getFoo();
a.getBar();
a.setFoobar(10, 20);

 
setFoobar()には0以下の値が渡されると強制的に変数には1が挿入される。アクセサによって0以下の値が入ることを防いでいる。メソッドを呼ぶ側では意識せずとも、ちゃんとオブジェクトが適切に処理してくれるのだ。
 
メソッドを呼ぶ側でいろいろ考えるよりも、このやり方のが効率が良い。
 
 
以上
 
 
参考
IT用語辞典

Objective-Cの勘所6 アクセサの扱い arrow-right
Next post

arrow-left Objective-Cの勘所5 メソッドの扱い
Previous post

コメントを残す