繁体   English   中英

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

[英]DataDAO class with a hundred static methods, how to refactor

我有一个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”,然后为每个不同的对象创建一个子类来实现该接口。 但是某些操作不能完全与接口保持一致,这似乎是很多不必要的工作。 为什么这是个好方法?

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

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

如果公共接口都包含公共方法,则它们可以在所有DAO上使用。 例如,有10种对象类型(表)和每DAO已 reate - [R EADùPDATE d elete方法。

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

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

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

为什么将这种方法static 我没看到原因。 我认为方法签名可能类似于:

public List<Card> getCardsForUser(String userId)

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

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

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

遵循Java命名约定。 因此,最好使用cardNew不是card_new

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM