领域模型的那些事儿:从领域获取知识2014-08-08 fangang 前言:你写过用例模型吗?也许有;你写过领域模型吗?也许还没有。在这里,我们可以尝试写写领域模型,看看它的作用、带给我们的好处。随着RUP在中国的传播,人们开始尝试用RUP统一过程来指导软件的设计和开发,但这些尝试并不成功。比较普遍的,大家都开始使用用例模型来进行需求阶段的分析和设计了。当然,能做出第一步已经非常不错了,但这远远不够。要做好需求分析,用例模型可以帮助我们分析清楚软件需求中要求的各个流程,但我们还缺少OO分析。过去,一旦需求分析完成以后,经过简短的分析过程,马上就开始进入开发阶段。在开发阶段,应当设计哪些类,它们的职责是什么,应当为它们设计哪些属性和方法,如何协作工作,在何时由谁来创建,以上这些问题都没有经过系统的分析,而是非常随意地添加类,非常随意地添加属性和方法,并且非常随意地在某个时刻创建对象。这样的设计,虽然可以实现需求所要求的功能,但它必然不能低耦合、高内聚,实现一个灵活多变、可维护性高的系统。即使有个别有经验的程序员的灵光闪现,但那只能在某个局部得到了优化,从整体上依然不是一个理想的分析设计。总之,没有经过系统的OO分析和设计,我们不能提高我们的代码质量。要进行系统的OO分析和设计,在需求分析阶段就要从领域模型开始。从严格意义上讲,领域模型还不算是真正的OO分析和设计。真正的OO分析和设计是在需求分析人员完成需求分析以后,由技术人员完成的分析和设计(即分析模型和设计模型)。但领域模型在为日后的分析与设计准备着素材。用例模型为日后的分析与设计准备着流程操作方面的素材(动态模型),而领域模型为日后的分析与设计准备着类与类之间关系方面的素材(静态模型)。领域模型就是描述日后可能关心所有事物(可能描述成类,也可能描述成类中的属性)以及它们之间的关系。因此,领域模型是一批类图,以及它们的说明。它与用例模型在需求分析阶段一起进行编写,不分先后顺序,并在完成该阶段以后作为工作成果一起提交。和用例模型一样,领域模型的建立也是以迭代的方式逐渐推进的。但一直以来,对领域模型设计进行描述的书籍比较少,即使在大师Craig Larman的经典著作《UML和模型应用》中对领域模型的也比较模糊。然而,这一现状被另一位大师Eric Evans打破,在他的经典著作《领域驱动设计》中,详细为我们描述了如何通过领域模型,驱动我们进行OO分析和设计。下面我们开始我们的领域驱动之旅吧。从业务领域提取知识在一个阳光明媚的下午,我们一个个西装革履、精神抖擞地来到了客户的办公现场。在一个明亮的会议室里,宽大深褐色的椭圆木桌旁已经聚集了十来个业务人员。看到我们进来,大家握手问候。相继就座后,互相介绍,往来寒暄,唠唠家常。共同的家乡,或熟或不怎么熟的某个人,都可能成为拉近彼此关系的理由。逐渐,一切开始进入正题。客户开始絮絮叨叨的描述自己的需求,而我们则在紧张的做着记录,是不是问一些问题,表明我们的立场,抒发我们的建议。在这样一个过程中,客户会描述他们的每一个业务,会讲解每个业务的流程,他们会讲出一些业务领域的专业词汇(尽管有些你当时还不太懂)。在这样一个过程中,作为需求分析员,你应当非常注意业务流程中的一些关键词汇,你应当(在当时或者过后)将它们提取出来,通过询问客户,弄清楚他们的定义,以及相互之间的关系。而这些词汇就是建立领域模型的开始。这是一个财务软件的业务讨论会,一个业务人员正在跟我讲付款单是怎样制作成凭证的。“每张付款单都有一个商品明细,每个商品明细都有它的价格、数量和金额。”他指着一张付款单向我解释着。从这句话,我可以提出一些关键信息:付款单、商品明细、价格、数量和金额。付款单与商品明细是一对多关系,并且商品明细聚合在付款单中。每个商品明细都有价格、数量和金额,也就是说,价格、数量和金额是商品明细的属性,这都很清楚。紧接着,他下面的讲解就不是那么清楚容易了。“如果按照一张单据生成一张凭证,那么每张付款单生成一张凭证。单据中的每个明细在凭证中生成一条借方分录和一条贷方分录。将付款单中的付款科目作为借方科目,将付款单结算方式对应的结算方式科目作为贷方科目。现结的付款单在采购发票中已制作凭证了,因此不再单独制作凭证。非预付的付款单不制作凭证,而是其执行付款核销以后,在核销单中制作凭证。”经过对以上语言的分析,我们可以绘制以下关系:一张凭证包含多个分录,是内聚关系。分录分为借方分录和贷方分录两种。一条商品明细对应一条借方分录和一条贷方分录。借方分录中包含“借方科目”属性,对应付款单中的付款科目;贷方分录中包含“贷方科目”属性,对应的是付款单中的一个什么科目。在这里,你可能对客户的描述不明白,因此要他做出解释。原来客户预先制订了一个规则,付款单中的结算方式分布对应了一个结算方式科目。OK,你在绘制的图形中,把结算方式科目作为关联类,将结算方式和贷方科目进行了一个关联。这样,“付款单生成凭证”这样一个场景的领域模型就绘制出来(如图)。