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

Advertisement

インタフェースの導入

さっそく前回のコードを修正する。まず、このメソッドでは4種類のSQL(出荷済み・解約済み・返品済み・破損品)を扱っているため、各SQLごとにクラス分けを行う。すべてのクラスに共通する処理が存在するため、インタフェースを導入することにより、安全にクラス分割を行うことにする。

サンプルコード

SelectInterfaceインタフェース
import java.sql.PreparedStatement;
public interface SelectInterface {
    public PreparedStatement setBind(PreparedStatement stmt);
    public String getSql();
    public void execute();
}
各クラスが保持するSQLを受け取るgetSqlメソッド、SQLに変数を設定するsetBindメソッド、そしてSQLを実行するメソッドexecuteメソッドをインタフェースとして定義した。

これを受けて、このインタフェースを実装するクラスは以下のようになる。

SearchNormalクラス(出荷済みの製品を検索する)
import java.sql.*;
public class SearchNormal extends AbstractClass{
    private String シリアルコード;
    private String 製品担当者コード;
    private String 解約月;
    private String 取消月;
    private String 返品月;

    public PreparedStatement setBind(PreparedStatement stmt){
        try{
            stmt.setString(1, this.製品担当者コード);
            if(this.シリアルコード != null){
                stmt.setString(2, this.シリアルコード);
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
        return stmt;
    }

    public String getSql(){
        String sql = " SELECT A.商品名, A.数量 ,A.金額 "
                   + " FROM 商品情報 A "
                   + " WHERE A.製品担当者コード = ? ";
        if(this.シリアルコード != null){
            sql += " AND A.シリアルコード = ? ";
        }

        return sql;
    }

    public void execute(){
        
        // 本来ならコメント部分のようなコーディングになる。
        // 今回は実験のため、簡略化
        //try{
            String sql = this.getSql();

            // PreparedStatement stmt = null;
            //Connection con = null;
            //stmt = con.prepareStatement(sql);
            //stmt = this.setBind(stmt);
            // 取得したSQLを実行
            System.out.println(sql);
        //}catch(SQLException e){
        //    e.printStackTrace();
        //}
    }
}
他の3個のクラスも似たようなクラスになる(今回は省略)

クライアント
public class Main {
    public static void main(String[] args) {
        SearchInterface control;

        switch(検索タイプ){
            case 1:
                control = new SearchNormal();
                break;
            case 2:
                control = new SearchKaiyaku();
                break;
            case 3:
                control = new SearchModori();
                break;
            case 4:
                control = new SearchBreak();
                break;
        }
        control.execute();
    }
}
この修正で、多くのswitch文の除去・クラスの責務の分割を行うことができた。最初のコードに比べてかなりオブジェクト指向らしくなった。これで終わりとしてもよいが、さらにリファクタリングを進めることができるので、もう少し修正してみよう。

Advertisement

ショートカット

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

サイト検索

Google

Web サイト内

Y!ログール