サンプルをつくるぜ 第2弾

メソッドのみで構成されたこいつはまだ多態性のカケラしかない。
同一のメソッドから唯一の形態しか取れないのはいかんでしょってことで、
クラスを用意してみる。

<クラス編>
 (1)1つに付き1種類しか役割を持たないクラス
 (2) (1)をいくつかまとめているだけのクラス

これにのっとって、(1)「Selectを投げる役割」のクラスを作る事にする。

// やっぱり省くぜヘッダコメント
public abstract class GenericSelect {
  
  // 省略:ヘッダコメント!
  public String createSQL(){
    // 実装はサブクラスにて行うこと
  }
  // 省略:ヘッダコメント
  public RecordSet executeQuery( String strSQL ){
    // 実装はサブクラスにて
  }
  // 省略
  public RecordSet arrangesData( RecordSet rsItem ){
    // 実装はサ(ry
  }
}

これを利用した形で以下の「queryToResultSet()」を変える

public ResultSet queryToResultSet( GenericSelect gs ){
  RecordSet result = null;  // 戻り値作成用

  // 1. SQL文を作る
  String strSQL = gs.createSQL();

  // 2. SQL文を投げてRecordSetを取得する
  result = gs.executeQuery( strSQL );
  //if( !( result == null ) ){
  //   4.(RecordSetの結果を加工する)
  //  result = gs.arrangesData( result );
  //}

  return result;
}

こうなればGenericSelectさえ継承しておけば遠慮なくqueryToResultSet()に投げる事ができるようになる。
たとえば社員マスタを作り、

public class EmployeeMaster extends GenericSelect{
  // 実装省略っ
}

呼び元ではこう投げる。

  // あえてこんな風に宣言してみる
  GenericSelect selecter = new EmployeeMaster();
  // ※もちろん「EmployeeMaster selecter = new EmployeeMaster();」で何の問題もない。

  RecordSet rs = queryToResultSet( selecter );

これでEmployeeMasterに定義されているこの3つの内容が実行されることになる。
 ・createSQL();
 ・executeQuery();
 ・arrangesData();

EmployeeMasterでなくとも給与マスタとか、車マスタとか、テレビマスタとかでも
手順を全く変えずに実行できる仕組みができる。

  GenericSelect selecter = new 給与マスタ();
  RecordSet rs = queryToResultSet( selecter );

になるか

  GenericSelect selecter = new 車マスタ();
  RecordSet rs = queryToResultSet( selecter );
  GenericSelect selecter = new テレビマスタ();
  RecordSet rs = queryToResultSet( selecter );

ってな感じになるかでそれぞれの検索結果が取得できるようになる。