模型中业务方法寻求解惑

我们现在有一个模型Member,我想输出Member的性别,比如先生、女士。
是否可以在模型中有这么一个方法

@Transient
public String getSexLang() {
return sex = 1 ? "先生" : "女士";
}

注:在标签层,我这么输出 ${item.sexLang}

性别是一个枚举。而现在的需求是能输出中文名称。

这样的方法能否放在模型中,能否做为一个业务方法存在呢。

这个判断过程我不想放在表现层,因为可能有多个页面需要判断,如果都写死,那么改的时候要到处找。

[该贴被fnet于2011-03-20 16:31修改过]

可以.没有问题,楼主别想的太多了.

可以委托专门组件实现,模型中封装的是精简战略目标,而不是如何实现,而且在专门组件中用配置文件定制中文语言,实现国际化。

非常感谢指点。

按严格要求,模型中的确不应该出现这种方法。
1. 此方法没有业务含义
2. banq说的国际化原因

我想这个应该放到界面上去用国际化方式输出。

再次感谢。

2011年03月22日 00:35 "fnet"的内容
我想这个应该放到界面上去用国际化方式输出 ...

不一定非要转移到界面层,有的也不能转移,只能由模型指挥一些专门组件比如Pretty时间库http://www.jdon.com/jivejdon/thread/40047

这个组件是用来根据当前时间和数据修改时间差值,判断输出“XXX分钟前”或“XX分钟后”这样输出,是由业务模型驱动的。这个组件被我用在jivejdon上,如果一小时内有人发帖,就在全站发出通知“XX分钟前谁发了新帖”,这个页面显示内容都是在领域模型驱动下完成,但是代码中没有hardcode硬编码任何中文信息。

可下载jivejdon 4.2看看,主要模型在com.jdon.jivejdon.model.notification中。
http://sourceforge.net/projects/jdon/files/jivejdon/4.x/

感谢banq。

还有一个问题想请教。

对于校验,以前用struts时,我们都是用FormBean校验,或者Common-Validator配置文件的方式。
我们现在将校验放在模型里,使用Hibernate Validator的方式。

校验至少分为以下几种:
客户端输入校验,主要是js,html限制长度。
服务器端输入校验,同客户端输入校验。一般放在controller层
业务数据校验,涉及业务方面,可能与持久层交互。一般放在controller层或service层。

客户端校验不用说。
服务器端校验,我们现在主要使用Hibernate validator方式。
业务数据校验,我们有没有必要放在模型中。还是与模型独立开。

我觉得既然我们发起一个业务操作是针对业务模型。那么是否可以理解为,模型可以自己完成校验过程。

说的不是很清晰,请您见谅。请您多多指教,非常感谢。

比如像这样的校验

public boolean validateAreaid(WebErrors errors
, AreaManager areaManager, Long areaid) {
if (areaid == null) {
errors.addErrorString("地区不能为空");
return false;
}
Area area = areaManager.get(Area.class, areaid);
if (area == null) {
errors.addErrorString("地区不存在");
return false;
}
return true;
}

分清楚是业务校验,还是数据录入普通校验,所谓业务校验就是违背业务一致性原则的校验,比如订单中一个条目价格修改了,那么订单总价格肯定修改,这种一致性就必须在模型中完成,可见DDD一书中订单案例,如果价格总是变,可设定价格为值对象。

象你举例的几个都是逐项校验,不涉及太多业务检查,可放到表现层如formBean中,如果你把Hibernate的模型看成是领域模型,也没有必要放在领域模型,如果你把Hibernate的模型看成是持久层校验,放入其中倒是可以的。

反正,必须搞清楚我们说的DDD领域模型虽然可以用Hibernate的对象模型暂时替代,但是不会很优雅,在我的JiveJdon中,这两者是分离的,领域模型纯粹生存在内存中In-memeory,否则,两者混在一起,领域模型内部设计包括方法都要考虑到Hibernate持久化,造成技术限制业务,这和数据库技术限制业务就没太大区别,50步和100步的区别而已。

业务应该凌驾技术至上,技术不应该限制业务,这是原则。公仆不能凌驾于主人之上,只有在人类社会才可能颠倒过来,这技术世界千万别将错就错了。