リファクタリングの実例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ラボ サイト検索Y!ログール |