如何将数据与业务逻辑解耦

9

以下是情景描述:

假设我有一个用户类,如下所示:

public class User{
  private String firstName;
  private String lastName;
//...
// setter, getters
}

然后我有一个类来处理用户评论,代码如下:
public class Comments{
  // some fields
  public static loadComments(User user, int count){...}
}

到目前为止,这些都是非常基础的内容。然而,我当然想添加一些辅助功能,以便更轻松地为用户加载评论。因此,我可以在用户类中创建一些东西:

final static int defaultCount = 10;
...
public Comment comments(){
  return Comments.loadComments(this, defaultCount);
}

我认为这是一种不需要传递用户实例的简单方法。但是,现在我感到不满意,因为我已经将我的用户bean对象与加载评论的业务逻辑耦合了起来。我还保存了用户类中不应该存在的默认计数。那么最好的方法是什么呢?我的目标是将此对象传递给jsp,以便可以调用JSTL函数。我有一个想法,可以创建一个名为UserWrapper的包装器,它看起来像这样...

public class UserWrapper{
  private final static defaultCount = 10;
  private final User user;
  public UserWrapper(User user){
    this.user = user;
  }

  // should probably cache this but i am not going to show this for simplicity
  public Comments getComments(){return Comments.loadComments(user, 10);}
}

我希望我表达清晰。我不喜欢使用useBean标签,因为这种情况下它并不是必需的。我希望有一种更简洁的方法来解决这个问题!任何帮助都将不胜感激! 编辑:我忘了提到一件事。我想能够在JSTL中使用此代码。这意味着它必须是一个getter。DAO模型很出名,但当我的前端开发者需要编写脚本或我需要为他可能需要或可能不需要的地方加载它时,并没有太大帮助。

想了一下,我认为更好的问题是通常DAO都是静态函数。如果每个函数都需要传递一个参数,比如oAuth令牌,会发生什么情况?在这种情况下,不将DAO设置为静态,并使其接受令牌作为构造函数似乎更合理。例如:new UseDao(String token)。你有什么想法吗? - Amir Raminfar
2个回答

3

从技术独立的角度来看...

是的,你说得没错,耦合性很高。可以参考 层次结构模式 来指导业务逻辑和数据的结构。例如,设计两个子系统可能是一个很好的想法:一个用于逻辑,另一个用于层次结构。通过允许逻辑向数据层传递消息来限制它们之间的通信。此外,您可以使用Facade模式来表示每个子系统,从而进一步降低耦合度。将每个层视为黑匣子。

还有一个可能有用的模式是数据访问对象模式。它将帮助您定义层之间在必要时传递数据的契约。


有时候拥有DAO只是一种过度设计。比方说,如果我有评论、通知、邮件、状态更新等等...创建一个巨大的文件来加载这些数据并不那么干净。此外,我不能直接从jsp中调用它。我忘了提到,一个目标是写更少的代码!哈哈。我可以创建门面、DAO,但最终可能会发现管理变成了一场噩梦。 - Amir Raminfar
2
那就试试增量开发吧。先在纸上好好规划一下,看看是否一切都符合要求(可以让朋友来确保你的设计是合理的)。你说得没错,精简的设计最好。但要确保它能够满足你的所有需求,并且它是松散耦合的。很容易,对吧? :) - Mike
+1 Mike。@Amir - 关于架构的事情是要有一个关于你想要/需要将应用程序带到何处的想法;这与YAGNI非常不同。我发现(通常)一旦你采用像Mike这样的方法,你很快就会熟悉它,而“管理”问题也会有效地消失。 - Adrian K

2

我喜欢使用数据访问对象(DAO)来完成这项任务。您的UserComment类仅包含这些对象的字段,然后创建单独的类来检索有关这些对象的数据。DAO是您包含有关如何检索、更新、选择等的逻辑的地方。例如:

public class UserDAO {

     public UserDAO() {
        //maybe setup a Hibernate connection or JDBC connection here
     }

     public User getUser(int userId) {
        User user;
        //code to retrieve user from datasource
        return user;
     }

     //other methods for update, delete, select, etc
  }

  public class CommentsDAO {
     private static int DEFAULT_COUNT = 10;

     public CommentsDAO() {
        //maybe setup a Hibernate connection or JDBC connection here
     }

     public Collection getCommmentsForUserWithCount(User user, int count) {
        Collection comments = new Set();
        //retrieve comments from datasource limit to count

        return comments;
     }

     public Collection getCommentsForUser(User user) {
        return getCommentsForUserWithCount(user, DEFAULT_COUNT);
     }

     //other methods for update, delete, etc
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接