DDD心得
这个账号发表的第一篇文章,之前的账号因为涉嫌灌水被封掉了(以前关于泛型的文章http://www.iteye.com/topic/585900)
因为最近在看DDD,所以又想起出来冒个泡。
首先我还是想先说说泛型这个概念。泛型什么意思我就不说了,不知道的人可以去百度下。
?
之前有人说这是个语法糖的概念,其实这个只能算是语法糖。纯粹属于语法范围的东西。
?
但是我觉得这是违背面向对象思想的东西,看过DDD之后我的感触是,我们的思维太不自然了,不知道是谁告诉我有一个业务层,可能是因为Transaction Script模式让人误以为可以抽一个层出来。
?
我甚至还看到这样一种所谓的分层架构:
表示层 -?业务逻辑层 -?数据存储层
?
正如Jdon上讨论的,这种架构简直让人觉得Java就是送数据到数据库,将数据库取出来显示。那么我想知道SSH这个所谓的常用架构有意义吗?
?
看看SSH都教我们做了点什么:
STRUTS 验证表单、封装表单成一个和数据库表一一对应的对象
然后将这个对象交给Spring给我们所谓的业务逻辑层
然后业务逻辑层,整个一层都用事务包裹起来,然后呢?
送给Hibernate管理的数据存储层。。。
?
好了,其实Hibernate不用了,为什么还要用Hibernate?
谁能告诉我?因为他有缓存?搞笑吧。。
?
好吧,不信,我们举个例。
?
就拿用户(User)这个对象来说吧,我们怎么写的??
?
?
public abstract class User { //刚才的代码省略掉 public void login(){ //详细代码省略 }}?
OK,这里就引入了一个对象状态的概念了。用户已经正确进入系统,并激活。
?
那么用户有几种状态?
1.不在系统内
2.在仓储休息,没有被激活
3.被激活但是没有登录系统
4.登出系统时被激活了
5.放回仓储
6.从仓储中删除,移除整个系统
?
下面我们说说Value Object这个概念,详细的请参考DDD这本书。
?
当然,所谓的value object的划分是一个很微妙的概念,你可以将Certification作为Value Object也可以不,为什么?
如果这个”证书“可以被其他人继续使用,比如:手机号码系统,如果这个号码可以被别的人继续使用,那么他就不是值对象,如果她跟着用户一起销毁,他就是一个值对象。
?
也就是我们说的聚合和聚集的概念,也是我们常常说的对象生命周期的概念。
?
当然辨别这个Certification是否作为值对象还有一个标准,那就是唯一标识,其实你也知道他是有的,但是我们是否需要将这个唯一标志暴露给别人呢?或者说这个标志是不是用来拿去Certification这个对象的呢?当然。。。不是,我们是用这个值对象来拿去User的,User才是我们的重头戏,而不是Certification。
?
怎么思考?其实就从这个角度去想,银行取钱关心的是Certification,而不是User,那么他就不是值对象,而是实体,因为我们需要这个卡号,而Certification才需要关联一个User,根据卡得到人。
?
JavaEye也一样。。。我的账号已经被保留了,但是用户的某些信息已经Over了,比如说我的Email可能已经不在数据库了。
?
好吧,继续,我们讨论一个普通网站的用户系统。
这个系统最主要的是用户而不是这个卡号,这个卡号需要跟随用户一起存在,那么,如果用户丢失了,是不是应该保留用户信息呢?这是一个问题,普通网站是这么干的,不需要了,那么Certification就是值对象。
?
好了。。抛砖引玉,欢迎拿玉砸我,这些都是个人见解,也算是笔记吧,这本书我还在继续研究。
?
1 楼 juancai 2011-01-22 关于Domain Events ,我也一直在思考这个问题,原来已经有了解决之道