原创作者: partech
阅读:2351次
评论:0条
更新时间:2011-05-26
相对于UI的开发受限于既有框架的结构,DomainModel有更大的灵活性,因为框架本身由自己开发的。
在整个DomainModel框架中,最基础的对象莫过于DomainObject。DomainObject既然是所有领域
对象的父类,就该体现最基础的特征。并且为其他层或某些方面提供一致的入口。
“有名万物之母”,这也是DomainObject中需要体现的。
DomainObject的名有很多,很多的原因是有很多关心它的参与者。
计算机使用的名--ID:必须,通常为64位的Integer。如果数据库是64位的CPU,据说这样定ID效率是最高的。
第三方和用户输入的名--Code:可选,String类型。尽管计算机知道了DomainObject,但用户却不知道,(用户登录系统就需要通过Code)第三方的开发人员也不知道。
用户期望看到的名--Name: 可选,String类型。对应于自然语言中的名。
用户期望看到的关于该对象的描述之名--Description:可选,String类型。这也需要最不重要的名了,对于该对象的备注,简要解释都可以放到这里。
有了名,我们就可以思考DomainObject了,基于“万物皆过程”的思考,表现过程的属性是需要加上的。于是
DomainObject有了{TimePeriod lifecycle}字段。lifecycle.start应该可以在某个构造函数中填入,当对象在业务上无效时可以填入lifecycle.end。DomainObject就“存活”于lifecycle之中。
当然你可以残酷一些,让DomainObject回归虚无,直接调用destroy方法,彻底删除它。
实际上持久化的DomainObject不过是反映了对象在lifecycle期间的当前快照,也就是说DomainObject存在很多快照,
我们可以使用{int version}来标识当前快照。
不知道什么时间,有人在DomainObject中放入了{int serialNumber},说是为了比较同类DomainObject的次序,我也说不清这是否站得住脚。
在整个DomainModel框架中,最基础的对象莫过于DomainObject。DomainObject既然是所有领域
对象的父类,就该体现最基础的特征。并且为其他层或某些方面提供一致的入口。
“有名万物之母”,这也是DomainObject中需要体现的。
DomainObject的名有很多,很多的原因是有很多关心它的参与者。
计算机使用的名--ID:必须,通常为64位的Integer。如果数据库是64位的CPU,据说这样定ID效率是最高的。
第三方和用户输入的名--Code:可选,String类型。尽管计算机知道了DomainObject,但用户却不知道,(用户登录系统就需要通过Code)第三方的开发人员也不知道。
用户期望看到的名--Name: 可选,String类型。对应于自然语言中的名。
用户期望看到的关于该对象的描述之名--Description:可选,String类型。这也需要最不重要的名了,对于该对象的备注,简要解释都可以放到这里。
有了名,我们就可以思考DomainObject了,基于“万物皆过程”的思考,表现过程的属性是需要加上的。于是
DomainObject有了{TimePeriod lifecycle}字段。lifecycle.start应该可以在某个构造函数中填入,当对象在业务上无效时可以填入lifecycle.end。DomainObject就“存活”于lifecycle之中。
当然你可以残酷一些,让DomainObject回归虚无,直接调用destroy方法,彻底删除它。
实际上持久化的DomainObject不过是反映了对象在lifecycle期间的当前快照,也就是说DomainObject存在很多快照,
我们可以使用{int version}来标识当前快照。
不知道什么时间,有人在DomainObject中放入了{int serialNumber},说是为了比较同类DomainObject的次序,我也说不清这是否站得住脚。
public abstract class DomainObject implements Comparable{ private Long id; private String code; private String name; private String description; private TimePeriod lifecycle; private int version; private int serialNumber; /** * 从持久层中重新构造DomainObject */ protected DomainObject(); { } /** * 业务上创建DomainObject */ protected DomainObject(String name, String code, int serialNumber, String description); { this.id = IdGenerator.getCurrent();.nextId(this);; this.version = 0; this.lifecycle = new TimePeriod();; this.name = name; this.code = code == null ? id.toString(); : code; this.serialNumber = serialNumber; this.description = description; } public void destroy(); { } @Override public int hashCode(); { assert id != null : this.getClass();.getName(); + " id为null"; return id.hashCode();; } @Override public boolean equals(Object obj); { if (!(obj instanceof DomainObject);); return false; DomainObject domainObj = (DomainObject); obj; return this.getId();.longValue(); == domainObj.getId();.longValue();; } public int compareTo(Object obj); { assert this.getClass(); == obj.getClass(); : "无在不同的DomainObject间比较"; DomainObject o = (DomainObject); obj; return this.serialNumber.compareTo(o.serialNumber);; } /** * 判断DomainObject是否已过期 */ public boolean isExpired(); { Calendar now = Calendar.getInstance();; if (now.compareTo(lifecycle.getEnd();); > 0); return true; else return false; } public TimePeriod getLifecycle(); { return (TimePeriod); lifecycle.clone();; } public void setEnd(Calendar end); { lifecycle.setEnd((Calendar); end.clone(););; } public void checkVersion(int version); { if (this.version.compareTo(version); != 0); throw new DataChangedByOthersException();; } }
评论 共 0 条 请登录后发表评论