如何从业务逻辑中分离数据

Ami*_*far 8 java architecture jsp packaging jstl

这是场景,

假设我有一个像这样的用户类:

public class User{
  private String firstName;
  private String lastName;
//...
// setter, getters
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个像这样的类来处理用户评论:

public class Comments{
  // some fields
  public static loadComments(User user, int count){...}
}
Run Code Online (Sandbox Code Playgroud)

到目前为止非常基本的东西 但是,我想添加一些帮助程序,以便更容易为用户加载注释.所以我可以在User类中创建一些东西:

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

我认为这是一种不必传递用户实例的简单方法.但是在这一点上,我很不高兴,因为我已经将我的用户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);}
}
Run Code Online (Sandbox Code Playgroud)

我希望我很清楚.我不喜欢使用useBean标签,因为它对于这样的东西不是必需的.我希望有更清洁的方法来接近这样的事情!任何帮助,将不胜感激!

编辑:我忘了提一件事.我希望能够在JSTL中使用此代码.这意味着它必须是一个吸气剂.DAO模型是众所周知的,但是当我的前端开发人员需要编写scriplet或者我需要将其加载到他可能需要或可能不需要的地方时,它并没有太大帮助.

Mik*_*ike 3

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

是的,关于这种耦合是令人望而却步的,你是完全正确的。请参阅层架构模式来提供有关构建业务逻辑和数据的一些指导。例如,设计两个子系统可能是一个好主意:一个用于逻辑,另一个用于层。通过仅允许逻辑将消息传递到数据层来限制它们之间的通信。此外,您可以使用Facade模式来表示每个子系统,从而进一步降低耦合。将每一层视为一个黑盒子。

另一种可能派上用场的模式是数据访问对象模式。它将帮助您定义层之间的合同,以便在必要时传递数据。

  • 那么尝试增量开发。在纸上好好计划一下,看看是否一切顺利(找朋友来确保你的设计是合理的)。你是完全正确的。精益设计是最好的。但要确保它能完成您想要的一切,并且是松散耦合的。容易,对吧?:) (2认同)