DataDAO类具有一百种静态方法,如何重构

时间:2019-02-18 23:58:37

标签: java

我有一个DataDAO类,我的Servlet使用它来对几种对象类型进行CRUD操作。当我刚开始的时候,我和这堂课只有几件事,所以看起来还可以。但是现在项目变得越来越大,我添加的每个功能都必须为此类添加一个新方法,因此现在我有大量的静态方法。似乎我应该对此进行一些重构,但不确定如何进行重构。有没有可以使用的设计模式?或者有人可以解释为什么我应该或不应该为此担心吗?我这样做只是出于学习目的,因此请不要告诉我使用一些简单的框架,我想尽可能细化地使用Java。这是一个典型示例:

public static ArrayList<Card> getCardsForUser(UserAccount user) {

    //TODO: get the username and password then get all flashcards linked to that user and return them in a list
    ArrayList<Card> cardsForUser = new ArrayList<>();

    try(Connection conn = DriverManager.getConnection(DBURL, un, pw)) {
        PreparedStatement pstm = conn.prepareStatement("Select * From flashcard where fk_user_id = ?");
        pstm.setString(1,user.getUserID());
        ResultSet usersCards = pstm.executeQuery();

        while(usersCards.next()){
            String cat = usersCards.getString("category");
            if(cat == null) {
                cat = "null";
            }
            Card card_new = new Card(usersCards.getString("card"),usersCards.getString("answer"),usersCards.getInt("cardid"),cat,usersCards.getInt("times_right"),usersCards.getInt("times_wrong"));
            cardsForUser.add(card_new);
        }
        System.out.println("Card For User size: "+cardsForUser.size());

        return cardsForUser;


    } catch(SQLException e) {
        //TODO: what happens now ?
        e.printStackTrace();
        return null;
    }

}

我的应用基本上是一种创建学习用“卡片”的方法。

我尝试创建一个接口“ DataDAO”,然后为实现该接口的每个不同对象创建一个子类。但是某些操作不能完全与接口保持一致,这似乎是很多不必要的工作。为什么这是个好方法?

2 个答案:

答案 0 :(得分:1)

在这种情况下的最佳实践是为每种对象类型创建DAO类。

将所有内容放入全局类的负面影响是复杂性,可测试性和可读性。

如果所有DAO都包含通用方法,则它们可以在所有DAO上使用。例如,您有10种对象类型(表),并且每个DAO都有 C reate R ead U pate D 删除方法。

您可以从Spring Boot框架中复制一些想法,在该想法中,这样的DAO始终是每个对象类型一个,并且在您的解决方案中也是如此

https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

答案 1 :(得分:1)

您的类名DataDAO本身暗示设计中有问题。最好对不同的对象类型使用单独的DAO类。例如。 CardDAOUserAccountDAO

为什么要使用此方法static?我没看到原因。我认为方法签名可能类似于:

public List<Card> getCardsForUser(String userId)

请注意,我返回的是List,而不是ArrayList

由于您是一名学习者,因此我还将提及以下几点:

避免在同一范围内使用多个名称相似的变量。您的代码中有usersCardscardsForUser。这可能会造成混淆。对于ResultSet,您可以使用resultSetrs之类的名称。

遵循Java命名约定。因此,使用cardNew比使用card_new更好。