Encapsulation(カプセル化)復習


Encapsulation(カプセル化)とはなんだっけかな?

最近OOPの基本概念の1つであるカプセル化の理解が薄れていたので、めちゃくちゃ復習範囲狭めで自分の復習用で書きます。

カプセル化ってなんなの?とプログラミングしたことない彼女に聞かれた場合、
簡単に説明すると、薬のカプセルみたいに、外部から中にあるあの細かい粒たちを守ることw。と最初に言い、それからコードで説明するかも。

外部からオブジェクトに対するアクセスコントロールと自分は理解しています。(本当はもっとあるかもしれない。。)
コメントでアドバイスを頂き、自分の理解が間違っていたことに気付けました。

アクセスコントロールはカプセル化をするための手段なので、カプセル化とは違いますね。

カプセル化の説明

カプセル化は、ソフトウェアを分割する際に、関係するデータとそのデータを必要する処理を1つにまとめ、無関係なものや関係性の低いものをクラスから排除することで「何のためのクラスなのか?」というクラスの目的を明確化するために行い、ほかのクラスに重複するデータや処理がない状態を目指すものです。

めちゃくちゃ簡単なコードで具体的に説明すると

Person.java
public class Person {
    private int age;
    private String name;
    // クレジットカードの暗証番号
    private int creditCardPinNum;
    public double weight = 69;

    public Person(int age, String name, int creditCardPinNum) {
        this.age = age;
        this.name = name;
        this.creditCardPinNum = creditCardPinNum;
    }
    // getter
    public String getName() {
        return name;
    }
    // setter
    public void changeName(String name) {
        this.name = name;
    }

    // 外部から年齢を読むことはできる getter
    public int getAge() {
        return age;
    }
}

注意:概念を復讐するため、自分なりの解釈になってます。

まず人って年齢変えれませんよね?10歳の人が”明日から20歳する”とはできません、
なので、Personクラスのageは変更できないようアクセスコントロールされています(メンバー変数をprivateにし、setterメソッドをなくしている)。
他人に自分の年齢は伝えることはできるので、getterはあります(嘘がつけるとかは今回無しで)。

nameですが、人って名前は何回でも変更可能なので、Person クラスではsetterメソッド(changeName)が書かれています。

まとめ

カプセル化とは外部からのアクセスコントロール(情報隠蔽)
カプセル化は、ソフトウェアを分割する際に、関係するデータとそのデータを必要する処理を1つにまとめ、無関係なものや関係性の低いものをクラスから排除することで「何のためのクラスなのか?」というクラスの目的を明確化するために行い、ほかのクラスに重複するデータや処理がない状態を目指すものです。