`
fangang
  • 浏览: 877067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
311c4c32-b171-3767-b974-d26acf661fb2
谈谈用例模型的那些事儿
浏览量:38652
767c50c5-189c-3525-a93f-5884d146ee78
一次迭代式开发的研究
浏览量:68809
03a3e133-6080-3bc8-a960-9d915ed9eabc
我们应当怎样做需求分析
浏览量:409974
753f3c56-c831-3add-ba41-b3b70d6d913f
重构,是这样干的
浏览量:91582
社区版块
存档分类
最新评论

谈谈领域模型的那些事儿 之 从领域获取知识

阅读更多
前言:你写过用例模型吗?也许有;你写过领域模型吗?也许还没有。在这里,我们可以尝试写写领域模型,看看它的作用、带给我们的好处。

随着RUP在中国的传播,人们开始尝试用RUP统一过程来指导软件的设计和开发,但这些尝试并不成功。比较普遍的,大家都开始使用用例模型来进行需求阶段的分析和设计了。当然,能做出第一步已经非常不错了,但这远远不够。要做好需求分析,用例模型可以帮助我们分析清楚软件需求中要求的各个流程,但我们还缺少OO分析。过去,一旦需求分析完成以后,经过简短的分析过程,马上就开始进入开发阶段。在开发阶段,应当设计哪些类,它们的职责是什么,应当为它们设计哪些属性和方法,如何协作工作,在何时由谁来创建,以上这些问题都没有经过系统的分析,而是非常随意地添加类,非常随意地添加属性和方法,并且非常随意地在某个时刻创建对象。这样的设计,虽然可以实现需求所要求的功能,但它必然不能低耦合、高内聚,实现一个灵活多变、可维护性高的系统。即使有个别有经验的程序员的灵光闪现,但那只能在某个局部得到了优化,从整体上依然不是一个理想的分析设计。总之,没有经过系统的OO分析和设计,我们不能提高我们的代码质量。要进行系统的OO分析和设计,在需求分析阶段就要从领域模型开始。

从严格意义上讲,领域模型还不算是真正的OO分析和设计。真正的OO分析和设计是在需求分析人员完成需求分析以后,由技术人员完成的分析和设计(即分析模型和设计模型)。但领域模型在为日后的分析与设计准备着素材。用例模型为日后的分析与设计准备着流程操作方面的素材(动态模型),而领域模型为日后的分析与设计准备着类与类之间关系方面的素材(静态模型)。领域模型就是描述日后可能关心所有事物(可能描述成类,也可能描述成类中的属性)以及它们之间的关系。因此,领域模型是一批类图,以及它们的说明。它与用例模型在需求分析阶段一起进行编写,不分先后顺序,并在完成该阶段以后作为工作成果一起提交。

和用例模型一样,领域模型的建立也是以迭代的方式逐渐推进的。但一直以来,对领域模型设计进行描述的书籍比较少,即使在大师Craig Larman的经典著作《UML和模型应用》中对领域模型的也比较模糊。然而,这一现状被另一位大师Eric Evans打破,在他的经典著作《领域驱动设计》中,详细为我们描述了如何通过领域模型,驱动我们进行OO分析和设计。下面我们开始我们的领域驱动之旅吧。

从业务领域提取知识

在一个阳光明媚的下午,我们一个个西装革履、精神抖擞地来到了客户的办公现场。在一个明亮的会议室里,宽大深褐色的椭圆木桌旁已经聚集了十来个业务人员。看到我们进来,大家握手问候。相继就座后,互相介绍,往来寒暄,唠唠家常。共同的家乡,或熟或不怎么熟的某个人,都可能成为拉近彼此关系的理由。逐渐,一切开始进入正题。客户开始絮絮叨叨的描述自己的需求,而我们则在紧张的做着记录,是不是问一些问题,表明我们的立场,抒发我们的建议。在这样一个过程中,客户会描述他们的每一个业务,会讲解每个业务的流程,他们会讲出一些业务领域的专业词汇(尽管有些你当时还不太懂)。在这样一个过程中,作为需求分析员,你应当非常注意业务流程中的一些关键词汇,你应当(在当时或者过后)将它们提取出来,通过询问客户,弄清楚他们的定义,以及相互之间的关系。而这些词汇就是建立领域模型的开始。

这是一个财务软件的业务讨论会,一个业务人员正在跟我讲付款单是怎样制作成凭证的。“每张付款单都有一个商品明细,每个商品明细都有它的价格、数量和金额。”他指着一张付款单向我解释着。从这句话,我可以提出一些关键信息:付款单、商品明细、价格、数量和金额。付款单与商品明细是一对多关系,并且商品明细聚合在付款单中。每个商品明细都有价格、数量和金额,也就是说,价格、数量和金额是商品明细的属性,这都很清楚。紧接着,他下面的讲解就不是那么清楚容易了。“如果按照一张单据生成一张凭证,那么每张付款单生成一张凭证。单据中的每个明细在凭证中生成一条借方分录和一条贷方分录。将付款单中的付款科目作为借方科目,将付款单结算方式对应的结算方式科目作为贷方科目。现结的付款单在采购发票中已制作凭证了,因此不再单独制作凭证。非预付的付款单不制作凭证,而是其执行付款核销以后,在核销单中制作凭证。”经过对以上语言的分析,我们可以绘制以下关系:一张凭证包含多个分录,是内聚关系。分录分为借方分录和贷方分录两种。一条商品明细对应一条借方分录和一条贷方分录。借方分录中包含“借方科目”属性,对应付款单中的付款科目;贷方分录中包含“贷方科目”属性,对应的是付款单中的一个什么科目。在这里,你可能对客户的描述不明白,因此要他做出解释。原来客户预先制订了一个规则,付款单中的结算方式分布对应了一个结算方式科目。OK,你在绘制的图形中,把结算方式科目作为关联类,将结算方式和贷方科目进行了一个关联。这样,“付款单生成凭证”这样一个场景的领域模型就绘制出来(如图)。


1.如何提取概念类
这是一个我们非常熟悉的情景剧,它为我们揭示了建立领域模型是怎样开始,也就是说,我们是如何获取领域模型所需素材的。获取领域模型所需素材通常有两个途径:与客户现场交流中获得,和在用例的各个流程中提取名词或名称短语获得,这些我们称之为概念类。现在的问题是,哪些应当成为领域模型中的概念类呢?如果我引用一堆定义和准则,并不能让你清楚明了,也许一个生动的比喻更能够让你理解深刻。需求分析有时候就像一部部动画剧,而那些枯燥乏味的概念,纷繁复杂的流程,在这些动画剧中似乎都突然活了,个个都有语言有性格。在这些动画剧中扮演的所有角色,就是我们需要的概念类。而他们做的所有动作,就是用例模型中的所有流程。

另一个比较挠头的问题就是,业务领域中的哪些概念应当成为概念类,哪些应对成为概念类中的属性。这是一个非常模糊的问题,没有一个准确的答案。一般来说,如果一个概念记录的仅仅是一段文字或一个数字,那么它应当作为一个概念类中的某个属性,否则就应当作为一个概念类。比如“快递员送快递”,这里的“快递员”、“快递”都是从中提取的概念类,但是“快递”中的“地址”呢?这要看你现在分析的这个系统如何去记录这个“地址”了。如果记录的仅仅是一个文本,那么它应当成为“快递”中的一个“地址”属性;如果记录的不仅仅是一个文本,而是精细地记录了“邮政编码”、“城市”、“街道”、“通讯地址”等信息,那么它应当成为一个概念类,与“快递”进行关联。

除了这些名称和名称短语形成的概念类,还有一些相对独立的行为,作为服务也应当形成概念类。这一类概念类我们可以在需求分析不断深化的过程中,在以后的迭代中加入到领域模型。

2.建立关联关系
除了提取概念类,领域模型还需要绘制出这些概念类相互之间的关系。由于领域模型是一个类图,概念类是一个个的类,因此概念类之间的关系一般有三种:依赖、关联和继承。

依赖是类与类之间最普通的关系,它仅仅表示一个类(客户类)了解它的供应者类,并且供应者类的变化会影响到客户元素。依赖关系表现为,客户类会创建、引用供应者类,或者供应者类是客户类中的一个变量(参数变量、局部变量、全局变量或属性变量)。没有供应者类将会造成客户类无法创建、无法使用,因此依赖是一种耦合关系。依赖在UML中被绘制成从客户类指向供应者类的一条虚线箭头。

关联是依赖关系的一种特例,它代表供应者类是客户类的一个属性变量。关联关系往往具有双向性,如一个部门关系的关联中,部门是员工类的一个属性,表示某个员工的所属于一个部门,而员工集合又是部门类的一个属性,表示某个部门下都有哪些员工。但是,在我们研究的业务领域中,我们往往关心的是某个方向的关联关系而忽视了另一个方向的关联关系。如一个工资管理系统中,我们往往关心的是员工在哪个部门,而很少关心某个部门下有哪些人。在这种情况下,关联关系表现为了一种导航,即员工对部门的导航。关联关系在UML中表示成一条直线,而具有导航的关联关系则表示成从被引用类指向引用类的实线箭头,即员工指向部门的箭头。

除了导航,关联关系还表现为一对一、一对多、多对一和多对多关系。在绘制关联关系的时候,我们通过在实线的两端标注“1”或“*”来说明,这里就不展开讨论了。另外,我们还可以在关联关系的中间用简短的一个词或短语,说明这是怎样的一个关系,或者在关联关系的两端标注这两个类分别代表的角色。

特别值得说明的是多对多关系。为了说明多对多关系的对应关系,往往还需要在关联关系中添加一个关联类。如用户权限模块的用户与角色就是一个多对多关联,因此在它们中间还需要增加一个“用户与角色关系”类,表明哪些用户与角色关联,哪些角色与用户关联。
关联关系是领域模型主要关注的一种关系。

聚合关系是关联关系的特例,它除了表示一种具有导航的关联关系外,还表示一种整体与部分的关系,如订单与订单明细、凭证与凭证分录等。聚合表示为一段是黑色菱形的实线,黑色菱形端代表整体,另一端代表部分。聚合在以后的领域分析中占有重要位置,我们回头再讲。组合是聚合的特例,它与聚合的唯一区别是,当代表整体的类被摧毁时,代表部分的类必须摧毁。由于组合涉及到了太多的技术实现,与领域模型的宗旨不符,我们往往很少去分析组合关系。

除此之外,领域模型还会出现继承关系。由于领域模型中不可能出现接口,因此领域模型不可能出现实现关系。

3.领域模型的说明
在建立领域模型的时候一个非常重要的事情就是,一定要避免领域模型中的概念类出现二义性。在一次我与客户讨论需求的过程中,我和客户都使用了一个业务术语,但我们对这个业务术语的理解存在着差异,以致我们花了大量时间来讨论一个问题,却谁也没有向对方说明白自己的意思,直到最后我们发现对这个术语理解的偏差。这是一个反面的例子,说明避免二义性对沟通的重要。领域模型的说明,应当对一些重要词汇或者业务术语进行必要解释。

另外,领域模型的说明还有详细解释各个类之间的相互关系,特别是那些关联关系,为日后的分析设计提供支持。
  • 大小: 22.3 KB
0
0
分享到:
评论
3 楼 lwqenter 2012-04-22  
楼主,等待你的“谈谈设计模型的那些事儿”啊,有木有啊
2 楼 fangang 2012-01-30  
需求分析是一个由粗到细不断细化的过程,同样,用例分析也是按照这样一个过程进行的,因为这样是符合人类认识事物的规律的。

比如,如果将软件开发本身作为需求分析的内容进行分析,起初的分析是粗浅的,所以绘制出一个整体的用例图,包含需求分析、设计、编码、测试这几个用例。但这样的分析不足以支持我们的设计开发,因此我们需要进一步细化。比如需求分析这个用例,在我们进一步细化时就形成了另一个名为“需求分析”的用例图,它可能包含需求调研、需求分析、编写用例、需求验证等多个用例,而“设计”用例也会进一步形成“设计”用例图,包含概要设计、详细设计、数据库设计等用例。

经过第一轮细化以后,如果需要,我们还要对复杂的部分进行第二轮细化。比如“编写用例”部分,我们可能进一步细化为绘制用例图、编写用例说明等等。

根据我以往的经验,用例分析的关键是别人能看得明白,这里的别人包括客户、设计人员、开发人员、测试人员,甚至实施人员。用例分析的核心不是用例图,而是用例说明。清晰的层次结构,无歧义的文字说明,全面而透彻的业务分析,这些才是用例分析的价值所在。

在我的用例分析中,常常在关键部分加入一些领域模型。领域模型是对关键业务对象的含义、关键业务对象间关系的说明。领域模型通常是类图,但在一些复杂关系中,甚至需要使用对象图才能清楚明白地表达出来。
1 楼 夜枫舞影 2012-01-29  
翻看了兄台几篇关于需求分析的文章,觉得有些共鸣,小弟有不少细节想请教一二。


在我工作中,捕获需求一般也都是使用用例图、活动图之类RUP工件。
将需求陈述转换成可供开发的系统用例之后,流程性很难表现出来。

我想举瀑布过程举个例子表达问题。
假设分析、设计、编码、测试四个流程关键点被依次访问,组成了“软件开发”这个最终目标。
在我拆分用例时,很自然的将四个阶段划分为四个用例,每个用例有自己的事件流。
想请教的是,
你是否会将“软件开发”这个大用例拆分成多个独立的用例(使用include/extend方式不算拆分)?
如果按照我上面做法,我想问的是四个用例的流程关系如何表达呢?因为用例之间并不具有控制流/对象流之类的交互概念。
我看了一些资料是说使用更高一层的顶级用例描述完整业务,再将高层用例拆分成多个子用例详细描述。

希望朋友能分享点经验,我觉得项目管理中最难做的一块就是需求管理,拥有一份直观易懂的参考文档,是对业务的深入理解以及频繁变更的一个基础。

相关推荐

    谈谈软件开发的那些事儿

    3. 领域模型:领域模型是从业务领域中抽象出来的概念模型,它反映了业务的核心逻辑和实体关系。通过领域驱动设计(DDD),开发者可以更好地理解和表达业务规则,提高代码的可读性和可维护性。 4. 分析模型:分析...

    谈谈知识获取和机器学习.pdf

    知识获取的过程一般分为三个阶段:首先,明确系统的目标和领域知识的基本结构,通过对领域知识的深入理解,构建问题求解的模型;其次,从知识源中抽取并实现这些知识,这通常涉及知识的形式化表达和映射到特定的表示...

    谈谈Windows 8降级那些事儿.docx

    在探讨Windows 8降级那些事儿时,首先要明确的是,微软在Windows 8的最终用户许可协议(EULA)中确实赋予了用户一项特殊权利,那就是降级权。这意味着购买预装了Windows 8专业版的用户有权限将操作系统降级至Windows...

    说说低功耗开发的那些事儿

    ### 低功耗开发的关键知识点 #### 一、低功耗的概念与标准 低功耗设计是指在保证产品性能的前提下,尽可能减少设备运行时的能量消耗。对于“什么是低功耗”,并没有一个统一的标准,而是根据具体的应用场景来定义...

    领域驱动设计C# 2008实现问题.设计.解决方案

    领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在通过紧密合作将业务专家和开发人员的知识融合,以解决复杂领域的业务问题。在C# 2008这一特定编程环境下,实现DDD可以帮助开发人员创建...

    16 编排其实很简单:谈谈“控制器”模型.pdf

    16 编排其实很简单:谈谈“控制器”模型.pdf

    谈谈GPT 模型背后以数据为中心的 AI

    最近,取得重大进展的领域是大型语言模型 (LLM) 的开发,例如GPT-3、ChatGPT和GPT-4。这些模型能够准确的执行语言翻译、文本摘要和问答等任务。 虽然很难忽视 LLM 不断增加的模型规模,但同样重要的是要认识到,...

    20120926-民生证券-商贸行业:从物流、资金流,信息流谈谈电商那些事儿.pdf

    标题和描述中提到的知识点主要涉及电子商务(电商)领域的几个重要方面,它们分别是物流、资金流和信息流。这些要素是电商运营的关键组成部分,通过全面分析这些要素,可以深入了解电商行业的运作机制和未来发展趋势。...

    16. 谈谈判别式模型和生成式模型1

    在机器学习领域,模型的选择对任务的性能至关重要。两种主要的模型类型是判别式模型和生成式模型,它们有着不同的工作原理和应用场景。这里,我们将深入探讨这两种模型的理论基础,常见应用以及它们之间的差异。 **...

    谈谈在B端落地第三方大模型的步骤.docx

    资源摘要信息 :"谈谈在 B 端落地第三方大模型的步骤" 本文探讨了在 B 端落地第三方大模型的步骤,旨在帮助企业解决依赖第三方 AI 技术时面临的不可控性和不确定性问题。文章首先介绍了“信息 + 模型 + 行动”的结构...

    大语言模型、讯飞星火大模型java 包

    在IT行业中,大语言模型和Java包是两个关键概念,特别是在人工智能和自然语言处理领域。本文将详细探讨这两个概念以及它们在实际应用中的结合。 首先,我们来理解“大语言模型”。大语言模型是一种深度学习算法,其...

    20120926-民生证券-商贸行业:从物流、资金流,信息流谈谈电商那些事儿.rar

    在电子商务中,物流是商品从卖家到买家手中传递的关键环节。报告可能详细阐述了物流在电商中的重要性,包括配送效率、成本控制、服务质量等方面。高效的物流系统可以提高客户满意度,缩短交货时间,降低库存成本,并...

    koishi插件,获取ai绘画的模型、vae、pt和lora列表.zip

    在AI绘画领域,koishi插件是一个非常实用的工具,它专为获取各种人工智能绘画模型而设计。koishi插件的使用,可以帮助用户快速获得包括VAE(变分自编码器)、PT(风格迁移网络)以及LORA(局部保留全局关联)等在内...

    谈谈MATLAB在“数学模型”课程教学实践中的重要性.pdf

    MATLAB在数学模型课程教学中的重要性可以从多个方面进行阐述。首先,MATLAB是一种功能强大的软件,它由MathWorks公司开发,广泛应用于工程与数学领域。它集成了数值计算、符号运算、可视化建模、仿真和图形处理等...

    linux那些事儿.rar

    "linux那些事儿.rar"这个压缩包文件显然包含了关于Linux系统、特别是与Linux驱动程序和USB相关的深入知识。 首先,让我们谈谈Linux。Linux是一种自由开源的操作系统内核,由林纳斯·托瓦兹在1991年创立。它的开放源...

    毕业设计答辩那些事儿.rar

    根据毕业时间的不同一般集中在5、6月份和9、10月份,那么最近一段时间也是学校毕业答辩的高峰时期,作为检验论文是否成功的最后一道关卡,有很多学生都不知道应该如何准备,今天我们就谈谈论文答辩那些事儿~ ...

    关于Java和Python爬虫那些事儿.zip

    在IT领域,网络爬虫是数据获取的重要工具,它能够自动化地从互联网上抓取大量信息。本压缩包“关于Java和Python爬虫那些事儿.zip”可能包含有关这两种语言进行网络爬虫的相关教程或示例代码。虽然标签部分为空,但...

    mq-9 无人机模型 gltf

    MQ-9无人机模型是基于GLTF格式的一种3D模型资源,适用于Cesium和Three.js这两个JavaScript库...通过这个模型,你可以深入了解3D图形渲染、地理空间数据可视化以及无人机的相关知识,同时提升自己的JavaScript编程技能。

    报童模型在仓储的应用

    本文主要探讨了报童模型在仓储领域的应用,特别是如何通过预期效用理论(EUT)框架来模拟风险厌恶的新闻供应商的行为。传统上,报童模型是基于风险中立的假设,即管理者会下单以最大化预期利润。然而,在实践中,很...

    谈谈WEB领域的红蓝对抗.pdf

    谈谈WEB领域的红蓝对抗 7月30日 山石网科线上沙龙 hcon 演讲PPT

Global site tag (gtag.js) - Google Analytics