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

Advertisement

責務の移動

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

修正版コード

Product クラス(変更点は強調文字で示す)
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Product{
    private String name;
    private String teika;

    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 boolean isError(){
        return this.isNameErr() || this.isTeikaErr();
    }

    private boolean isNameErr(){
        Pattern pattern = Pattern.compile("[A-Za-z0-9]+");
        Matcher matcher = pattern.matcher(this.getName());
        return !matcher.matches();
    }

    private boolean isTeikaErr(){
        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher(this.getTeika());
        return !matcher.matches();
    }
}

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

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

実際の効果

今までクライアント側で行っていたエラーチェックを Product クラスに移動した。オブジェクトが責任を持って処理を行う範囲のことを責務というが、今回はエラーチェックの責務をクライアントから Product クラスへ変更したことになる。

これにより、エラーチェック処理の一元管理が実現するため、ロジック変更の際に修正が発生するのは Product クラスのみとなる。

さて、最初のコードに比べると、かなりスッキリとしたコードになったが「エラーチェック処理のロジックは複数パターンあり、クライアントによって異なる。」という問題を解決できなくなってしまった。この問題を解決するためにさらなるリファクタリングが必要となる。

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ

サイト検索

Google

Web サイト内

Y!ログール