2011年01月27日 13:34 "banq"的内容
领域有主观成分。其实面向对象就是人为主观的,你关注它它就是对象,但你必须清楚,你关注它时,必须剔除各种人为带给它的影响,当然包括关注本身,所以,我们又假定领域是客观的。 ...
原以为这个例子够简单,所以昨天晚上代码实现了图书馆借书领域的原型,结果由于1个微不足道的bug,凌晨5点多才睡。白天打开楼主提供的链接,查看写那篇文章的作者的模型设计,与我设计的原型,竟然相差极大。作者来自于www.agilejava.com,应该是位经验非常丰富的程序员,使用了DDD提供的术语进行辨别各种实体、值对象、服务。我是根据自己正在摸索的一套方法来建模,借鉴了四色原型与DCI的部分思想,但不采用任何晦涩的术语。
根据我多年借书的经验来看,作者建立的模型似乎并没有对我这个“用户心中的需求”进行简洁、准确的描述。该作者似乎将“以用户心中的需求为中心”等同于“以用户为中心”,这两个是不同的概念,不能忽略其差异。这里想与banq老师重新确定几个最核心的概念。"领域模型”、“领域”、“用户需求”。
之前我有个说法,“领域相对于用户需求是主观的”,banq老师当时是同意这个观点,甚至修改了“领域是客观的,业务是主观(用户需求)”观点。现在我感觉banq老师的观点更正确,不过缺乏了足够的铺垫或者条件说明。如今,对于领域、领域模型、用户需求,我有了一番新的思考,对原来的观点进行了部分的修正。
“领域相对于用户需求是主观的”,这句话隐含了一个假设或参照,我们对领域认识的来源于用户需求,可是用户需求来自哪里呢?用户需求同样来自于领域,来自于对领域的诉求!之前我的另一个观点,“领域是对用户需求的素描”,这句话同样隐含了一个前提,用户需求接近于领域的本质,我们对领域的认识可以通过对用户需求进行素描而实现。
这里我重新确定领域、领域建模、用户需求三者的关系。
1)领域是客观的。
2)领域模型是主观的,体现了程序员对领域的认识,是程序员心中对领域的素描。
3)用户需求是主观的,体现了用户对领域的认识,是用户心中对领域的素描。
4)这点非常重要,就是“领域模型”与“用户需求”的关系,要展开来讲。
“用户需求”是对领域的“素描”,用户的需求来自对领域的“诉求”,这些诉求往往是深刻的,因为其来源于用户对领域长期观察和使用的经验,比起我们程序员,一般更完整、更真实地接近领域的本质。我们对“用户需求进行素描”,就是“借鉴用户的宝贵经验”,可以更快、更好地素描客观领域,这可以说是一条认识未知领域的捷径。但是当用户需求不明朗或不清晰时,我们需要超越“用户需求”,对领域进行深入的摸索,去寻求更清晰的视角,对领域进行刻画。
最后,再谈点这个图书领域的建模,是否应该包含参与者。我在实现原型时认为借书卡Card也是一个模型(DCI的D, 四色原型的PPT),同时也是一个角色(DCI的I的参与者, 四色原型的Role)。因为要实现“无卡还书”的场景,必须保证借书卡的唯一性,我不得不用“单例工厂”来管理Card的创建。不过,想想这与现实也不谋而合,在学校中,我们学生只能使用借书卡,却不能创建和注销借书卡。
我理解banq老师所说的建模时要排除的参与者,在这个案例中是指Reader,而不是Card,如果我的理解没有错,那我是赞同这一点。这个观点对于没有类似思维体验的人,是有点晦涩的,但是非常有意义的,我愿意这里解释一下,banq老师是否也是从这种角度出发?
领域模型(程序员对领域的认识)要包容用户需求(用户对领域的认识),这就像一个杯子要装满一杯水,我们在制作杯子时,制作的是空杯子,即要把水倒出来,之后才能装下水;再比如,一座房子要住人,我们在建造房子时,建造的房子是空的,唯有空的才能容乃人的居住。从这个意义,领域模型要将用户(参与者)排除在外,这是《老子》的“无之以为用”观点的一种应用。
我想banq老师更熟悉的例子应该是山水画(我不熟悉)。山水画的留白,体现的意境,也是领域建模“似乎没有用户”要达到的意境,即“无墨之韵”、“此时无声胜有声”、“无为胜有为”。不过,要达到这个境界,确非易事,需要的也许是毕生的努力。
赶紧睡觉,不然明天又起不来了。呵呵。