2010-10-26 137 views
8

这里的数据是该方案,如何分离业务逻辑

比方说,我有一个用户类,像这样:

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

然后,我必须像这样来处理用户评论类:

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

到目前为止非常基本的东西。但是,我想添加一些帮助程序,以便更轻松地为用户加载注释。所以我可以在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模型是众所周知的,但当我的前端开发人员需要编写一个脚本时,它并没有太多帮助,或者我需要将它加载到他可能需要或不需要的地方。

+0

嗯,想到它后嗯。我认为一个更好的问题是,通常DAO都是静态函数。如果必须将一个参数传递给每个函数,会发生什么情况。让我们说一个oAuth标记。我认为在这种情况下,不要只将DAO设为静态并使其接受令牌作为构造函数是有意义的。像新的UseDao(String token);有什么想法吗? – 2010-10-27 00:09:20

+0

嗯答案接受:P – 2010-10-28 00:18:26

回答

3

从技术的独立立场点...

是的,你是绝对正确的耦合是望而却步。请参阅Layers architectural pattern以提供关于结构业务逻辑和数据的一些指导。例如,设计两个子系统可能是一个好主意:一个用于逻辑,另一个用于图层。通过仅限于限制它们之间的通信,允许逻辑将消息传递到数据层。此外,您可以使用Facade pattern来表示每个子系统,从而减少耦合甚至更多。将每个图层视为黑匣子。

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

+0

有些时候有一个DAO只是一个矫枉过正。比方说,我有评论,通知,电子邮件,状态更新等......创建一个庞大的文件只是加载这些数据并不那么干净。另外我不能直接从jsp调用它。我忘了提及,一个目标是编写更少的代码!哈哈。我可以创建立面,DAO,并且只是为了找到一个巨大的噩梦来管理。 – 2010-10-26 19:28:26

+2

然后尝试增量开发。在纸上做好计划,看看是否所有东西都检查完毕(找一个朋友确保你的设计是理智的)。你绝对正确。精益设计是最好的。但要确保它做到了你想要的一切,并且它是松散耦合的。很简单,对吧? :) – Mike 2010-10-26 19:52:51

+0

+1迈克。 @Amir - 关于架构的东西是想知道你想要/需要去应用程序的位置;这与YAGNI非常不同。我发现(一般情况下)一旦你采用像迈克斯这样的方法,你很快就会熟悉它,而'管理'问题就会有效地消失。 – 2010-10-26 22:22:40

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 
    }