锁定老帖子 主题:domain model的延伸讨论
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-05
归纳我的一下思路,给出这样的伪代码,意思是在richDomainObject处铺平相关逻辑,其余各个部分设计于贫血模型无异,当然在ico等方面还需要更多的思考,具体实现还在思考之中。
这里的铺平实现,的确会有很多 委托的代码,但是这样如果具有一般规律的话,自己采取手段处理一下应该也简单的吧,ajoo的酒窝也提到了,在这方面的一些使用。 如果是这个帖子在于讨论 java 实现 rdo 的技术难度,那我们是否应该将思考多多集中在如何实现上呢,到最后也可以有个相对的结论吧 我看现在的把子明显有这个意思“java不好实现 rdo,ror天然支持, ror能更好的描述复杂业务逻辑”,很多人没关注问题的实质也是很自然了 public class richDomainObject implements richDomainObjectInterface{ private domainObjectPO; private domainObjectDAO<richDomainObject>; private domainLogic1<richDomainObject>; private domainLogic2<richDomainObject>; ... } public class action<richDomainObject>{} |
|
返回顶楼 | |
发表时间:2007-03-05
nihongye 写道 public class Department { public static void employee(String name, String department) { User.create(name,department); } } ..... 能简单说明一下吗? 这个是不是用JPA? 具体依赖于哪些库, 测试用的什么底层数据库等等. 每次都Query的办法逻辑是比较清晰, 不过效率会不会有比较大影响? |
|
返回顶楼 | |
发表时间:2007-03-05
引用 能简单说明一下吗? 这个是不是用JPA? 具体依赖于哪些库, 测试用的什么底层数据库等等.
每次都Query的办法逻辑是比较清晰, 不过效率会不会有比较大影响? 嗯,用的是redsoftfactory实现的jpa,测试数据库用hsqldb. 依赖的包包括(只运行这个测试,下面的jar不是最小的依赖:)): antlr cglib common-collections commons-lang commongs-logging ejb3-persistence.jar javassist.jar junit.jar log4j.jar readsoft_jpa.jar hsqldb.jar |
|
返回顶楼 | |
发表时间:2007-03-05
user.addUser()
领域模型的操作就一定是向持久层保存吗? 如果不是:那应该去区分下什么时候是与持久层打交道.而通过dao所做的操作是向持久层增加,通过domain所做的操作都不经过持久层. 如果是: 那在想想ruby的ActiveRecord,如果说过段时间,有人会感觉到ActiveRecord不是特别好,自己作了个ActiveRecord_New,而这个ActiveRecord_New大家都感觉非常棒,那ruby的使用者该怎么选择呢? 个人觉得在持久层方面,java的jpa出来的有些晚,它如果在hiberante或jdo等早出来,那么大家都有一个标准,就像ActiveRecord一样.其实ruby的ActiveRecord在功能上感觉像java的jpa.我们完全可以在damain中通过jpa去实现rich domain model.所以,个人完全赞同nihongye的做法.通过jpa去做rich domain model. 还有,搞不懂java为啥非要搞个get,set方法,虽然这些代码可以自动生成.完全可以通过关键字去做呀,除非是比较特殊的地方使用get,set. |
|
返回顶楼 | |
发表时间:2007-03-05
nihongye 写道 引用 能简单说明一下吗? 这个是不是用JPA? 具体依赖于哪些库, 测试用的什么底层数据库等等.
每次都Query的办法逻辑是比较清晰, 不过效率会不会有比较大影响? 嗯,用的是redsoftfactory实现的jpa,测试数据库用hsqldb. 依赖的包包括(只运行这个测试,下面的jar不是最小的依赖:)): antlr cglib common-collections commons-lang commongs-logging ejb3-persistence.jar javassist.jar junit.jar log4j.jar readsoft_jpa.jar hsqldb.jar nihongye的代码有一个问题,em是通过静态工厂获得的,不是外部注入的。但不严格去追究的话,也很不错了,写的很漂亮! |
|
返回顶楼 | |
发表时间:2007-03-05
norther写道:
"我认为领域模型就是OO模型在实际企业开发环境下的表现形式,根本就不是谁比谁高级的问题,领域模型是在企业开发中实现OO模型的最自然的形式..." re: 没错,域对象首先是OO,那么毫无疑问,域对象起码==OO,但是不同的是,域对象是“域”中的对象,也就是业务中的对象,因此,在抽象层面上要高于OO。域驱动开发的不是一个方法论,而是一种思想,设计的一切重心均要围绕于“域”,域对象就是承载这种思想的高级OO,比如,实现透明持久化。不知这种解释norther以为然否。另外,有网友写了一篇“小议领域模型”,我很认同这篇文章的多数观点,可以参考: http://www.cnblogs.com/yimlin/archive/2006/06/15/426929.html |
|
返回顶楼 | |
发表时间:2007-03-05
引用 nihongye的代码有一个问题,em是通过静态工厂获得的,不是外部注入的。但不严格去追究的话,也很不错了,写的很漂亮!
嗯,考虑到并发,em的管理需要用ThreadLocal,发生PersistenceExceptin异常时还要将它替换成新的em(这点不是很好做,没详细考虑过。在redsoftjpa entityManagerFactory对entityManager有这种em的管理方式,但早期的规范有,后来去掉了)。如果不是非要求注入,感觉这样写代码可以接受。另外代码是模拟了你写的。 |
|
返回顶楼 | |
发表时间:2007-03-05
nihongye 写道 引用 nihongye的代码有一个问题,em是通过静态工厂获得的,不是外部注入的。但不严格去追究的话,也很不错了,写的很漂亮!
嗯,考虑到并发,em的管理需要用ThreadLocal,发生PersistenceExceptin异常时还要将它替换成新的em(这点不是很好做,没详细考虑过)。如果不是非要求注入,感觉这样写代码可以接受。另外代码是模拟了你写的。 这里其实有一个不同编程语言的语法差异问题存在。例如在ruby里面,我可以在model里面随便定义静态方法,然后在其他model里面不经注入,可以直接引用这个model的静态方法。但是Java往往这样做是bad smell。 这是因为ruby没有接口,类型也是动态的,类别也是开放的,所以随时随地可以给类别添加行为,这样用没有什么问题,不需要通过IoC注入。但是Java如果不使用IoC方式注入,而是直接调用依赖类的静态方法,行为就被限定死了,复杂的类依赖关系的创建和织入就是一个很麻烦的问题,这也是Java引入IoC的主要原因。 |
|
返回顶楼 | |
发表时间:2007-03-05
我觉得 nihongye 的这个JPA实现确实是不错的Rich Domain Model in Java, 但回到这个主题我回第一篇帖(http://www.iteye.com/post/230190)时的想法, 就是这样的写法我个人感觉会让很多Java大牛不屑, 不知道大家怎么想的?
|
|
返回顶楼 | |
发表时间:2007-03-16
java里最接近ror的开发框架,我觉得是seam了
|
|
返回顶楼 | |