1

複数のメソッドを持つDAOクラスがあります。各メソッドでは、ResultSetに変数名「result」 、PreparedStatementに「statement」を使用し、closeResources()メソッドを使用してPreparedStatementと接続を閉じました。createConnection() メソッド、getConnection() メソッドを持つ DataManager クラスを使用しました。DAO には 10 個の mwthods があります。DAO ファクトリ メソッドを使用して、BO で DAO オブジェクトを取得しています。これはコードのスニペットであり、次のように示されています。 eclipse で CPD ツールを実行したときの違反です。DAO の約 6 ~ 8 つのメソッドで、このコードのスニペットが違反として表示されています。

PreparedStatement statement=null;

try{

PreparedStatement statement=connection.prepareStatement(query);

//statements to set data in query

ResultSet result=statement.executeQuery();

if(result.next){

//some operation

   }
}
catch(SQLException e){

//encapsulating sql exception....


throw new BusinessException(e);

}
finally{

closeResources(connection,statement);

}

DAOの多くのメソッドは同じアプローチを使用しているため、CPDは上記のコードを違反として示しており、このコードをよりモジュール化する方法はないと思います.私の質問は、多くの場合「結果」のような同じ変数名を使用しています.メソッドはベストプラクティスかどうかです。違反を解消するには、「結果」の名前を「結果1」、「結果2」などに変更する必要がありますが、それら名前意味がないと感じています。

注: トレーニングは終了しました。Springs や Struts の作業はしていません。サーブレットと JSP しか知りません。ケース スタディを行っています。PMD、CPD ツールを使用するのはこれが初めてです。

4

1 に答える 1

0

テンプレート メソッドパターンを使用します。

public void runQuery(Callback callback) {
    PreparedStatement statement=null;
    try{
        PreparedStatement statement=connection.prepareStatement(query);
        ResultSet result=statement.executeQuery();
        if(result.next){
            callback.onRow(result);  //crucial!
       }
    }
    catch(SQLException e){
        throw new BusinessException(e);
    }
    finally{
        closeResources(connection,statement);
    }
}

interface Callback {
    void onRow(ResultSet resultSet);
}

この方法を次のように使用します。

runQuery(new Callback() {
    public void onRow(ResultSet result) {
        //extract one row here
    }
});

変更される唯一のコードは、さまざまなCallbackテーブルから行を抽出するさまざまな実装です。このパターンに慣れたら、JdbcTemplateそのアイデアに基づいて構築されているが、はるかに強力でありながら低レベルで高速なパターンを確認してください。は必要ありません。

于 2012-08-30T19:41:31.423 に答える