@634

リファクタリングの実例1:第2回

Advertisement

カプセル化を行う

第一回で発見した問題点を以下に示す。
  • Productクラスの変数の型を変更した場合、Product・クライアント両方のコードを修正しなければならない。
  • クライアントからProductクラスを使用する際、毎回エラーチェック処理を記述しなければならない。
  • 複数のクライアントで、クライアントごとに異なるエラー判定ロジックを採用したい場合に適しているように見えるが、ロジックが変更になると、同じエラーチェックを行っているすべてのクライアントコードを修正しなければならない。
ここではカプセル化を行うことにより、「Productクラスの変数の型を変更した場合、Product・クライアント両方のコードを修正しなければならない。 」という問題点を解決する。

修正版コード

Product クラス(変更点は強調文字で示す)
public class Product{
    private String name;
    private String teika;
    private boolean error;

    public Product(String name, String teika){
        this.name = name;
        this.teika = teika;
    }

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

    public String getTeika(){
        return this.teika;
    }

    public void setError(boolean error){
        this.error = error;
    }

    public boolean isError(){
        return this.error;
    }

}

クライアント(変更点は強調文字で示す)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 製品を利用するクラス
 */
public class Main{
    public static void main(String[] args){
        // 製品の作成
        Product product = new Product("name", "1000");

        // エラー設定
        Pattern pattern = Pattern.compile("[A-Za-z0-9]+");
        Matcher matcher = pattern.matcher(product.getName());
        product.setError(!matcher.matches());

        pattern = Pattern.compile("[0-9]+");
        matcher = pattern.matcher(product.getTeika());
        product.setError(product.isError() | !matcher.matches());


        // エラー判定
        if(product.isError()){
            System.out.println("この製品は内部にエラーを含んでいます。");
        }else{
            System.out.println("この製品にエラーはありません。");
        }
    }
}

実際の効果

ここでは Product クラスをカプセル化し、アクセサメソッド(setXXX, getXXX)を実装したことにより、Productクラスの変数に直接アクセスできないようにした。これにより、Productクラスに変更が発生しても、クライアントを変更する必要がなくなった。詳細はカプセル化を参照。

また、プログラムの実行結果に変化がない事も、リファクタリングにとって重要なポイントである。リファクタリングの過程では、常に初期のプログラムと同じ振る舞いをする必要がある。

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール