【问题标题】:how to decouple data from business logic如何将数据与业务逻辑解耦
【发布时间】:2011-04-30 22:35:54
【问题描述】:

这是场景,

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

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

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

public class Comments{
  // some fields
  public static loadComments(User user, int count){...}
}

到目前为止非常基本的东西。但是,我当然想添加一些帮助程序,以便更轻松地为用户加载 cmets。所以我可以在 User 类中创建一些东西:

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 中使用此代码。这意味着它必须是一个吸气剂。 DAO 模型是众所周知的,但是当我的前端开发人员需要编写一个 scriplet 或者我需要将它加载到他可能需要或可能不需要的地方时,它并没有太大帮助。

【问题讨论】:

  • 嗯,想了想。我认为一个更好的问题是通常 DAO 都是静态函数。如果您必须将一个参数传递给每个函数,会发生什么情况。假设是一个 oAuth 令牌。我认为在这种情况下,不要只将 DAO 设为静态并使其接受令牌作为构造函数是有意义的。像 new UseDao(String token);有什么想法吗?
  • hmmmm 要接受哪个答案:P

标签: java jsp architecture jstl packaging


【解决方案1】:

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

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

另一个可能派上用场的模式是Data Access Object pattern。它将帮助您定义层之间的合同,以便在必要时传递数据。

【讨论】:

  • 有时拥有 DAO 只是矫枉过正。假设我有 cmets、通知、电子邮件、状态更新等......创建一个巨大的文件只是加载这些数据并不是那么干净。另外我不能直接从jsp调用它。我忘了提,一个目标是写更少的代码!哈哈。我可以创建门面、DAO,只是为了找到一个巨大的噩梦来管理。
  • 然后尝试增量开发。在纸上计划好,看看是否一切顺利(找一个朋友确保你的设计是合理的)。你是绝对正确的。精益设计是最好的。但请确保它可以满足您的所有需求,并且它是松散耦合的。容易,对吧? :)
  • +1 迈克。 @Amir - 关于架构的事情是了解您想要/需要使用应用程序去哪里;这与 YAGNI 非常不同。我发现(通常)一旦你采用像 Mikes 这样的方法,你很快就会熟悉它,“管理”问题就会有效地消失。
【解决方案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
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2010-12-04
    • 2019-01-22
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多