我正在使用Hibernate。它很棒。但是,假设我有一个对应于数据库表的类,只有getter和setter以及toString,相同的方法。现在我想添加一些帮助目的的方法,例如,假设我想使用一些添加的描述文本获取创建日期,如下所示。
public class Client {
private long id;
private Calendar creationDate;
protected String password;
public long getId() {
return id;
}
@SuppressWarnings("unused")
private void setId(long id) {
this.id = id;
}
public Calendar getCreationDate() {
return creationDate;
}
public void setCreationDate(Calendar creationDate) {
this.creationDate = creationDate;
}
..
.. some other getters and setters that corresponding to SQL columns
//Here I would like to have some help methods. Is it recommended to put it here?
public String getCreationDateInSecs() {
return "Date in secs: " + creationDate.getTimeInMillis * 1000;
}
}
问题是:我应该在哪里放置这种方法?
我应该将它与Value Object放在同一个类中,还是应该将它放在其他地方?如果你知道我的意思,我想知道最佳实践=)
祝你好运
答案 0 :(得分:5)
Bozho基本上概述了两种可能的方法:富模型和贫血模型,并建议将丰富的模型作为更多的OOPish。我会在这里提倡一种贫血的方法。
您描述的功能看起来像是表示层的责任。我认为将它放入与UI相关的类而不是域模型中会更好。
只要逻辑与
一样简单,将其置于域模型中就会变得无害return "Date in secs: " + creationDate.getTimeInMillis * 1000;
但是,假设您还需要返回本地化描述。您必须在域模型中添加对本地化工具的依赖性,这会增加代码的耦合。
因此,最好将不同层的职责分开。
答案 1 :(得分:4)
在实体中添加方法绝对没问题。它属于它所在的位置,因为它在对象的内部状态下运行。
您可以创建一个实用工具方法,例如ClientUtils.getCreationDateInSeconds(client)
,但这不是非OOP。
答案 2 :(得分:0)
如果您担心将实体与此类方法混合在一起,并且您有许多DAO方法,则可以考虑使用面向方法。
它允许您在不违反OO原则的情况下,在单独的“方面”中分离纯实体内容,DAO内容和其他实用方法。
Spring和AspectJ做得很好。 如果您想快速了解如何实现内容,请查看: http://static.springsource.org/spring-roo/reference/html/architecture.html