リファクタリングの実例2:第3回Advertisementメソッド・属性の引き上げ
前回に引き続き、リファクタリングを行う。今回はメソッド・属性の引き上げを行う。
リファクタリング
分割された、検索を行うクラスに注目すると、すべてのクラスにおいてexecuteメソッドが同じ動作(バインド変数の設定→実行)を行っていることがわかる。そこでスーパークラスを定義してexecuteメソッドの引き上げを行う。
スーパークラス Search
public class Search implements SelectInterface{
public PreparedStatement setBind(PreparedStatement stmt){}
public String getSql(){}
public void execute(){
//try{
String sql = this.getSql();
//Connection con = null;
//PreparedStatement stmt = null;
//stmt = con.prepareStatement(sql);
//stmt = this.setBind(stmt);
// 取得したSQLを実行
System.out.println(sql);
//}catch(SQLException e){
// e.printStackTrace();
//}
}
}
検索を行う各クラスはこのクラスを継承することになる。 出荷済み製品を検索するクラス
public class SearchNormal extends Search{
private String シリアルコード;
private String 製品担当者コード;
private String 解約月;
private String 取消月;
private String 返品月;
public String getSql(){//略}
public PreparedStatement setBind(PreparedStatement stmt){//略}
}
共通していたメソッドがスーパークラスへと引き上げられたため、各サブクラスはシンプルな状態を保てるようになった。 続いてサブクラスの変数(シリアルコード・製品担当者コード・解約月・取消月・返品月)に注目してみると、これもすべてのサブクラスが保持しているため、スーパークラスへの引き上げを行う。 スーパークラス Search
public class Search implements SelectInterface{
private String シリアルコード;
private String 製品担当者コード;
private String 解約月;
private String 取消月;
private String 返品月;
public PreparedStatement setBind(PreparedStatement stmt){}
public String getSql(){}
public void execute(){
//try{
String sql = this.getSql();
//Connection con = null;
//PreparedStatement stmt = null;
//stmt = con.prepareStatement(sql);
//stmt = this.setBind(stmt);
// 取得したSQLを実行
System.out.println(sql);
//}catch(SQLException e){
// e.printStackTrace();
//}
}
}
出荷済製品を検索するクラス
public class SearchNormal extends Search{
public String getSql(){//略}
public PreparedStatement setBind(PreparedStatement stmt){//略}
}
※本来ならsetXXX, getXXXメソッドを実装する。今回は省略。これで各サブクラスにはメソッドが2つ(SQLを返すメソッド・バインド変数を設定するメソッド)だけとなった。 次回に続く。 Advertisement |
ショートカット・634トップページ・このカテゴリのトップページに戻る ・634ラボ サイト検索Y!ログール |