一.领域建模Domain Modeling定义
领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示。领域模型也成为概念模型、领域对象模型和分析对象模型。
二.业务领域建模原因
- 领域建模可以降低软件和现实世界之间的差异,用真实的业务概念划分职责,目的是实现一个可以高效低成本维护的可持续发展的软件系统。
- 从领域模型推导到系统实现是一套引导思考的方式,也是一套科学的开发流程。其核心目的在于提供了系统设计的“指导方针”。领域模型必须站在用户需求和业务发展的角度上,既可以用来同客户沟通验证需求,又可以避免模型因实现的考量而带偏(实现成本、遗留系统)
- 软件工程师需要在不同的领域或不同的项目中工作,来自不同的背景,这可能会影响他们对应用程序域的感知。他们需要领域知识来开发系统。
三.模型(Model)通常由2部分组成:
1.对象(Object)
2.对象间的关系(Relationship)
四.领域建模(Domain Modeling)/业务分析的主要就是:
1.寻找业务对象(Business Object)
2.恰当建立这些对象间的关系
3.添加关联和属性
五.领域模型设计的步骤(如何进行领域建模):
5.1用例分析法
用例分析法是进行领域建模最简单可行的方式。其步骤如下:
- 1.获取用例描述
既然我们的领域模型指的是问题域模型,那么建模也一定要从问题域入手。那么问题域的知识如何表现出来呢,一个最常见的方式就是通过用例,也可以通过场景Scenario来分析——总之就是一段格式化的需求文字描述。
- 2.寻找概念类
寻找概念类就是对获取的用例描述进行语言分析,识别名词和名词短语,将其作为候选的概念类。
当然,需求描述中的名词不可能完全等价于概念类,自然语言中的同义词、多义词都需要在此处进行区分。还有很多名词可能只是概念类的属性,不过没关系,在这一步骤可以都提取出来,在第四步再区分出概念类和属性。
- 3.添加关联
关联意味着两个模型之间存在语义联系,在用例中的表现通常为两个名词被动词连接起来
- 4.添加属性
对于上文抽取到的名词列表,我们需要区分概念类和属性(当然名词列表也会有无用的词语)。
- 如何判断一个名词是否是属性?注意这里表达的依然是业务概念,外键ID不是属性。
- 能完全通过基本数据类型(数字、文本、日期)表达的大多是属性。
- 如果一个名词只关联一个概念类,并且它自身没有属性,那么他就是另一个概念类的属性。
- 5.模型精化
模型精化是可选的步骤,有时我们希望在领域模型中表达更多的信息,这时会利用一些新的手段来表达领域模型:包括泛化、组合、子域划分等
领域模型可以使用UML的泛化和组合表达模型间的关系,他们表达的是概念类的”is-a”和”has-a”的关系,并不是实现的软件类的关系。然而,也一些方法论中并不建议使用这种方式来表达领域模型,因为这种精化的领域模型不利于和需求方沟通。
子领域划分是常见的拆解领域的方式,通常来说我们会将更内聚的一组模型划分为一个子领域,形成更高一层的抽象。利于系统的表达和分工。
5.2 DDD的方法
DDD本身是一套完整、详尽的方法论,从如何需求沟通(构建领域知识),到高层设计(战略建模)、详细设计(战术建模),细致到代码的实现风格都给出了示例。本文无意也无力来详述DDD的所有知识,但是关于如何建模,DDD给出了很多思想可以借鉴。
需要再次强调的是,DDD的模型本质上是solution space的模型,然而DDD强调模型与实现绑定,因此这里指的“模型”,可以说是领域模型,也可以是系统模型。下面就是DDD建模的一般步骤:
- 构建领域知识
- 软件的最终目的是增进一个特定的领域。为了达到这个目的,软件需要跟要它服务的领域”和谐相处”。所谓和谐相处,软件需要精确地反应领域概念和知识,以更好的适应变化。
- 因此,软件开发者第一步也是最重要的一步就是理解领域知识。DDD鼓励开发者和领域专家工作在一起,通过交谈和提问,让开发者学习到领域知识,挖掘出领域的关键概念。
- 创建通用语言
- 通用语言是领域专家和开发团队之间定义的标准的术语。目的是把领域知识更完善地传达到软件中。
- 团队在进行所有方式的沟通时(文字,演讲,图形)都需要采用这种一致的语言。
- 通用语言需要映射到模型中,映射到代码里。做到通用语言的更改就是对模型的更改,也是对代码的更改。
- 创建实体
- 基于通用语言和领域知识,需要首先分辨出实体。
- 实体是领域中需要唯一标识的领域概念。如果两个实体所有状态都一样,但标识不一样,就是两个不同的实体。
- 实体同样需要属性来描述
- 创建值对象
- 值对象是领域中不需要唯一标识的领域概念。
- 如果两份对象所有状态都一样,我们就认为是同一个值对象。值对象也可以理解为一组聚合的属性。例如地址信息,类目信息
- 创建聚合根
- 聚合根是一个实体,将一组模型聚合在一起,与外部模型划分开来。这一组模型全部关联着聚合根,只有聚合根负责与外部访问。
- 聚合根有助于保持领域模型关联的简化和生命周期的维护
5.3四色建模法
- 四色模型
- moment-interval(时标性原型):时标性原型是建模的起点,它代表着我们需要记录的,某一时刻发生的事件。例如订单,行程,会议。
- party, place, or thing(人-事-物原型):一种有形的,可唯一识别的实体。可以是人、机构、地点、物品等。
- role (角色原型):角色是party, place, or thing的一种参与方式。例如,在一份雇佣关系中,某个人扮演者雇员的角色。那么这个人就是”party, place, or thing”,雇员就是”role”。
- description(描述原型):表示资料类型的资源,是一种类似目录条目的描述,用来对对象进行分类或标记,可以被其它原型反复使用。例如,一个商品的品牌、描述属性。
- 建模次序
- 首先以满足管理和运营的需要为前提,寻找需要追溯的事件。
- 根据这些需要追溯,寻找足迹以及相应的时标性原型。
- 寻找时标对象周围的人-事-物。
- 从中抽象角色。
- 把一些信息用描述对象补足。
六.以工程实践为基础,进行领域建模
我的工程实践为基于ESP32开发板建立Mesh网络,实现数据采集。以我的工程实践为基础,进行领域建模的步骤如下:
(1)发现类及其属性,在我的项目中需要多块ESP32开发板建立MESH网络,并连接网络进行数据采集,因此有STATION,Smartconfig,sensor,MESH。
(2)建立类之间的关联,通过手机使用ESP32的smartconfig功能来设置开发板的wifi参数连接网络,连接网络 后开发板通过wifi模块来实现MESH自组网络,最后通过连接传感器来获取数据,进行数据的采集发送。
(3)添加类的重要属性,网络连接station属性包括ssid,密码,加密验证方式,协议等方法;Smartconfig配置属性包括模式设置,协议,发送信息,启动等;MESH包括根节点选取,父节点选取,叶节点选取,通讯等,sensor负责数据采集等。
最后类图如下: