DDD的优势(3)

简介: DDD的优势(3)

7.6 领域建模方法

7.6.1 用例分析法

1.方法介绍

用例分析法是进行领域建模中最简单可行的方式,其步骤如下。

(1)获取用例描述

既然领域模型指的是问题域模型,那么建模也一定要从问题域入手。那么问题域的知识如何表现出来呢?一种最常见的方式是通过用例,也可以通过场景(Scenario)来分析,总之就是一段格式化的需求文字描述。

(2)寻找概念类

寻找概念类就是对获取的用例描述进行语言分析,识别名词和名词短语,将其作为候选的概念类。当然,需求描述中的名词不可能完全等价于概念类,自然语言中的同义词和多义词都需要在此处进行区分。还有很多名词可能只是概念类的属性,不过没关系,在这一步骤中可以都提取出来,在第4步中再区分出概念类和属性。

(3)添加关联

关联意味着两个模型之间存在语义联系,在用例中的表现通常为两个名词被动词连接起来,如图7-12所示。

在添加关联关系时要注意以下几点。

  • 并非所有动词关联的概念类都需要作为关联存在,更重要的是我们需要判断两个概念类的关系是否需要被记住。
  • 应该尽量避免加入大量关联。
  • 关联不代表数据流,也不代表系统调用关系。


image.png


(4)添加属性

我们需要区分概念类和属性(当然名词列表也会有无用的词语)。例如,对于上文抽取到的名词列表,“品名”是“商品”的属性,“iTouch”为无用的词语。

如何判断一个名词是否是属性?可以用下面两种方式。

  • 能完全通过基本数据类型(数字、文本、日期)表达的大多是属性。
  • 如果一个名词只关联一个概念类,并且其自身没有属性,那么它就是另一个概念类的属性。
(5)模型精化

模型精化是可选的步骤,有时我们希望在领域模型中表达更多的信息,这时会利用一些新的手段来表达领域模型,包括泛化、组合和子域划分等。领域模型可以使用UML的泛化和组合表达模型间的关系,表达的是概念类的“is-a”和“has-a”的关系。子领域划分是常见的拆解领域的方式,通常来说,我们会将更内聚的一组模型划分为一个子领域,形成更高一层的抽象,有利于系统的表达和分工。

2.案例介绍

下面举例说明,内容来自论文“Object-Oriented Analysis from Textual Specifications”,文中讲述了如何通过自然语言分析来做面向对象分析。

用例描述如下所示:

Vendors may be sales employees or companies. Sales employees receive a basic wage and a commission, whereas companies only receive a commission. Each order corresponds to one vendor only, and each vendor has made at least one order, which is identified by an order number. One basic wage may be paid to several sales employees. The same commission may be paid to several sales employees and companies

接下来,我们按照用例分析法的步骤来建模。

(1)寻找概念类

首把所有名词标记出来,作为概念类的候选类:vendors, sales employees, companies, basic wage, commission, order, order number。

(2)添加关联

如图7-13所示,接下来为名词添加关联,连接这些名词的动词会出现在关联的线上。注意,根据上面的用例,我们还不清楚给供应商(Vendor)支付佣金(Commission)的主体是谁,但这并不妨碍在本阶段的建模。


image.png


(3)添加属性

最后,为这些候选的概念类选择属性。在本例中,如果一个概念类只处于一个被动的关联关系中(如Basic Wage, Commission, OrderNumber),那么它需要作为关联类的属性,如图7-14所示。



image.png

相关文章
|
敏捷开发 开发框架 数据可视化
|
存储 算法 Java
HashMap 之底层数据结构和扩容机制
HashMap 之底层数据结构和扩容机制
1911 1
|
缓存 数据格式
实现LRU缓存的三种方式(建议收藏)
LRU全称为Least Recently Used,即最近使用的。针对的是在有限的内存空间内,只缓存最近使用的数据(即get和set的数据),超过有限内存空间的数据将会被删除。这个在面试题中也是常会被问到的内容,接下来就看看怎么来实现。
2218 0
实现LRU缓存的三种方式(建议收藏)
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
7月前
|
存储 安全 Java
synchronized 原理
`synchronized` 是 Java 中实现线程同步的关键字,通过对象头中的 Monitor 和锁机制确保同一时间只有一个线程执行同步代码。其底层依赖 Mark Word 和 Monitor 控制锁状态,支持偏向锁、轻量级锁和重量级锁的升级过程,以优化性能。同步方法和同步块在实现方式上有所不同,前者通过 `ACC_SYNCHRONIZED` 标志隐式加锁,后者通过 `monitorenter` 和 `monitorexit` 指令显式控制。此外,`synchronized` 还保证内存可见性和 Happens-Before 关系,使共享变量在多线程间正确同步。
731 0
|
SQL 人工智能 自然语言处理
AI战略丨蓝凌 + 通义千问,让知识管理产生新质变
“知识管理 + 大模型”落地通常不是简单的 1+1=2 的公式。
|
JSON 自然语言处理 Java
这款轻量级 Java 表达式引擎,真不错!
AviatorScript 是一个高性能、轻量级的脚本语言,基于 JVM(包括 Android 平台)。它支持数字、字符串、正则表达式、布尔值等基本类型,以及所有 Java 运算符。主要特性包括函数式编程、大整数和高精度运算、完整的脚本语法、丰富的内置函数和自定义函数支持。适用于规则判断、公式计算、动态脚本控制等场景。
|
存储 安全 Java
面试高频:Synchronized 原理,建议收藏备用 !
本文详解Synchronized原理,包括其作用、使用方式、底层实现及锁升级机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
面试高频:Synchronized 原理,建议收藏备用 !
|
存储 算法 程序员
操作系统(11)----内存管理5
操作系统(11)----内存管理
660 1
操作系统(11)----内存管理5
|
存储 NoSQL Java
Redis性能优化:理解与使用Redis Pipeline
当我们谈论Redis数据处理和存储的优化方法时, Redis Pipeline 无疑是一个不能忽视的重要技术。
1246 0
Redis性能优化:理解与使用Redis Pipeline