学会了面向对象的语法,却依然写不出面向对象的程序,因此我们需要了解如何从需求分析到面向对象设计这样一个过程。
一,什么是领域模型
领域建模。 从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向对象设计的一座桥梁。
顾名思义,就是显示最重要的业务概念和它们之间关系,是真实世界各个事物的表示(现实世界的可视化抽象字典)而不是软件中各构件的表示。(类:表示业务概念,通常只包含重要属性,少甚至不包含操作;关联、泛化:表达概念之间的关系)领域模型是描述业务领域(业务实体)的静态结构
理论派观点:
实战派观点:
理论派
领域模型是一种特殊的业务模型,它分析范围是整个行业,抽象出行业里共性和内在规律性的业务,比业务模型更加抽象,它不属于软件开发范畴的概念,与软件开发无关。
实战派
领域模型是一种分析模型,在软件开发过程分析阶段用于分析如何满足系统功能性需求,属于软件开发范畴,在UML中主要使用类图来描述领域模型。
业务模型是业务建模的输出物,业务建模研究的对象是公司或者组织,业务建模属于软件开发过程中的初始阶段。
软件开发过程:业务建模、需求、分析、设计。
在软件开发过程中我们接触到的领域模型属于实战派。
从这个定义我们可以看出,领域模型有两个主要的作用:
二,如何领域建模
领域模型如此重要,很多同学可能会认为领域建模很复杂,需要很高的技巧。事实上领域建模非常简单,概括一下就是“找名词”!
一个关键的问题还没有说明:从哪里找? 如果你还记得领域模型是“需求到面向对象的桥梁”,那么你肯定一下子就能想到:从需求模型中找,具 体来说就是从用例中找。
归纳一下域建模的方法就是“从用例中找名词”。 当然,找到名词后,为了能够更加符合面向对象的要求和特点,我们还需要对这些名词进一步完善,这就 是接下来的步骤:加属性,连关系!
最后我们总结出领域建模的三字经方法:找名词、加属性、连关系。
A. 发现类和对象:尽可能多的找出概念类(识别方法:概念类分类列表、名词性短语)
a.概念分类列表:人、事物、地点、组织、概念、事件、规则、抽象名词、交易项目、角色、设备、组织结构(对用例进行识别:实体、过程中的信息、角色的输入输出、操作设备等)
b.名词分析法:识别问题域和用例描述中的名词和名词性短语作为候选的概念类和属性,从候选项中,摒弃多余的名词,确定最终的对象(注意是作为类还是属性,类可以是一种标识、状态和行为)
B. 建立类之间的关联(关联、继承、依赖)
关联:类之间的某种语义关系包括聚合,组合
继承:一般到特殊
依赖:表明一个元素(源元素)的定义或实现依赖另一个元素(被依赖元素)的定义或实现
C. 添加类的重要属性(类的语义完整性、类的作用、问题域相关特性等)
a.语法:可见性 属性名:类型 多重性=默认值{特性表}
/ [可见性] 属性名 [:类型] [=初始值]
b.属性类型是简单的数据类型为佳,如果是复杂概念,考虑是否单独作为一个概念类
c.任何属性都不表示外键,即不应该用属性来联系概念类,区别于数据库设计中的外键
参考资料:云南大学软件学院PPT https://wenku.baidu.com/view/b5dfce3303d8ce2f00662382.html
三、实例
找名词
who : 学员、讲师、管理员
用例:
1. 管理员 创建了 北京 和 上海 两个校区
2. 管理员 创建了 Linux \ Python \ Go 3个课程
3. 管理员 创建了 北京校区的Python 16期, Go开发第一期,和上海校区的Linux 36期 班级
4. 管理员 创建了 北京校区的 学员 小晴 ,并将其 分配 在了 班级 python 16期
5. 管理员 创建了 讲师 Alex , 并将其分配 给了 班级 python 16期 和全栈脱产5期
6. 讲师 Alex 创建 了一条 python 16期的 上课纪录 Day6
7. 讲师 Alex 为Day6这节课 所有的学员 批了作业 ,小晴得了A, 李磊得了C-, 严帅得了B
8. 学员小晴 在 python 16 的 day6里 提交了作业
9. 学员李磊 查看了自己所报的所有课程
10 学员 李磊 在 查看了 自己在 py16期 的 成绩列表 ,然后自杀了
11. 学员小晴 跟 讲师 Alex 表白了
名词列表:
管理员、校区、课程、班级、上课纪录、作业、成绩、讲师、学员
加属性
连关系
有了类,也有了属性,接下来自然就是找出它们的关系了。