@634

リファクタリングの実例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ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール