カプセル化

1月 1, 2003 · Posted in その他 · Comment 

カプセル化を行った場合・行っていない場合の修正に対する柔軟さを検証。

カプセル化していないクラス

Profileクラス

public class Profile{
    public String name;
    public String age;
}

Profileクラスを利用するクライアントのコード

public class Main{
    public static void main(String[] args){
        Profile profile = new Profile();
        profile.name = "なまえ";
        profile.age = "10";

        System.out.println(Profile.name);
        System.out.println(Profile.age);
    }
}

ここでProfileクラスのageフィールドをint型に変更する。この場合、以下の修正を行わなければならない。

  • Profileクラスの変数宣言を変更。
  • クライアントコードの値の設定・取得部分の変更。

変更後Profileクラス

public class Profile{
    public String name;
    public int age;
}

変更後Mainクラス

public class Main{
    public static void main(String[] args){
        Profile profile = new Profile();
        profile.name = "なまえ";
        profile.age = 10;

        System.out.println(Profile.name);
        System.out.println(Profile.age);
    }
}

クライアント側でProfileクラスの内部構造に依存しているコードを記述してしまっているため、変更の影響範囲が大きくなり、両方のクラスを修正する必要がある。

カプセル化を行ったクラス

ここで、Profileクラスをカプセル化したコードを以下に示す。

public class Profile{
    private String name;
    private String age;

    public void setName(String name){
        this.name = name;
    }

    public void setAge(String age){
        this.age = age;
    }

    public String getName(){
        return this.name;
    }

    public string getAge(){
        return this.age;
    }
}

上記のカプセル化を行ったクラスを利用するクライアントのコードは以下のようになる。

public class Main{
    public static void main(String[] args){
        Profile profile = new Profile();
        profile.setName("なまえ");
        profile.setAge("10");

        System.out.println(profile.getName());
        System.out.println(profile.getAge());
    }
}

カプセル化を行ったクラスのageをint型に変更する場合、以下の変更が必要となる

  • Profileクラスの変数宣言を変更

public class Profile{
    private String name;
    private int age;

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

    public void setAge(String age){
        this.age = Integer.parseInt(age);
    }

    public String getAge(){
        return Integer.toString(this.age);
    }
}

クライアント側の変更

なし。

クライアントがProfileクラスの内部構造に依存するコードを書かなくなった(インタフェースのみに依存している)ため、Profileクラスを変更しても、クライアント側への影響がなくなった。

まとめ

クラスのカプセル化を行い、変更に強い設計をすることはオブジェクト指向の基本であり、比較的楽に実装できるにもかかわらず、多くの恩恵を受けることができる。

インスタンス変数

1月 1, 2003 · Posted in その他 · Comment 

読み・別名・略語

読み
インスタンスヘンスウ
別名
メンバ変数
正式名称
instance variable

解説

各インスタンスが個別に保持する変数。

サンプル

public class Sample{
    // インスタンス変数
    public int age;
    public String name;
}

インスタンスメソッド

1月 1, 2003 · Posted in その他 · Comment 

読み・別名・略語

読み
インスタンスメソッド
別名
メンバメソッド・インスタンス関数・メンバ関数
正式名称
instance method

解説

各インスタンスが個別に持っているメソッド。

サンプル

public class Sample{
    public void method(){
        System.out.println("インスタンスメソッド");
    }
}

« 前ページへ次ページへ »