我有一个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”,然后为实现该接口的每个不同对象创建一个子类。但是某些操作不能完全与接口保持一致,这似乎是很多不必要的工作。为什么这是个好方法?
答案 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类。例如。 CardDAO
,UserAccountDAO
等
为什么要使用此方法static
?我没看到原因。我认为方法签名可能类似于:
public List<Card> getCardsForUser(String userId)
请注意,我返回的是List
,而不是ArrayList
。
由于您是一名学习者,因此我还将提及以下几点:
避免在同一范围内使用多个名称相似的变量。您的代码中有usersCards
和cardsForUser
。这可能会造成混淆。对于ResultSet
,您可以使用resultSet
或rs
之类的名称。
遵循Java命名约定。因此,使用cardNew
比使用card_new
更好。