Ошибки CPD в классе DAO

У меня есть класс DAO с несколькими методами. В каждом методе я использовал имя переменной "result" для ResultSet и "statement" для PreparedStatement и метод closeResources() для закрытия. PreparedStatement и Connection. Я использовал класс DataManager, который имеет метод createConnection(), метод getConnection(). В моем DAO примерно 10 mwthods. Я использую фабричный метод DAO для получения объекта DAO в BO. Это фрагмент кода, который отображается как нарушение, когда я запускал инструмент CPD в eclipse. Он показывает этот фрагмент кода как нарушение примерно в 6-8 методах моего DAO.

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 показывает приведенный выше код как нарушение, и я не думаю, что вы можете сделать этот фрагмент кода более модульным. Мой вопрос заключается в использовании того же имени переменной, что и "result " во многих методах является лучшей практикой или нет. Чтобы устранить нарушение, мне нужно переименовать "result" в "result1", "result2" и т. д., но мне кажется, что эти имена не имеют смысла.

Примечание. Я заканчиваю свое обучение. Я не работал над Springs или Struts, я знаю только Servlets и JSP. Я делаю тематическое исследование и впервые использую инструменты PMD, CPD.


person saiki4116    schedule 30.08.2012    source источник


Ответы (1)


Используйте шаблон Шаблонный метод:

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 который основан на этой идее, но намного, намного мощнее, но по-прежнему низкоуровневый и быстрый. Вам не нужно полное spring, чтобы использовать его.

person Tomasz Nurkiewicz    schedule 30.08.2012
comment
Спасибо за быстрый ответ. Но я не совсем понял ваш код. ` обратный вызов (результат); ` обратный вызов — это ссылка и то, как он принимает аргумент. - person saiki4116; 31.08.2012
comment
@ user701199: в моем коде была ошибка, теперь понятно? Одиночный onRow() метод переданного интерфейса обратного вызова вызывается несколько раз. - person Tomasz Nurkiewicz; 31.08.2012