リファクタリングの実例1:第2回Advertisementカプセル化を行う
第一回で発見した問題点を以下に示す。
修正版コード
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ラボ サイト検索Y!ログール |