uml-类图书写指南
说明
类图是最常用的UML图,面向对象建模的主要组成部分。它用于描述系统的结构化设计,显示出类、接口以及它们之间的静态结构和关系。
类图主要产出于面向对象设计的分析和设计阶段,用来描述系统的静态结构。
基本元素
类图的基本组成元素是类、接口以及关系三种。
类
类由三部分组成:
classname:类的名字;
field:类的属性/成员变量,field由三部分组成,第一部分表示可见型(+public,-private,#protected),第二部分表示属性名词,第三部分表示属性类型;
method/operate:类的操作/方法。由四部分组成,第一部分表示可见性,第二部分表示方法名,第三部分表示参数类型,第四部分表示返回值类型。
具体示例:
抽象类于普通类基本一样,name上方有<<abstrace>>标志。
接口
接口与类十分类似,就是name上方有<<interface>>标志,没有field。
关系
泛化(Generalization)
泛化对应到代码里就是具体的父类的继承关系。表示方式是空心三角形的直线。
实现(realize)
实现是描述子类对抽象类/接口的实现关系。
依赖(dependency)
依赖关系表示一个类依赖于另一个类的定义,不过这个关系比较弱,仅表示一个类在运行时需要另一个类的定义,而不需要在内部持有另一个类(use a)。简单点儿说就是类A的临时变量、方法参数等依赖类B。
依赖关系是用一套带箭头的虚线表示的。
关联(Association)
关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。在代码里一般表现形式为成员变量。
自然语言描述的例子:我和我的好朋友,就可以认为是关联关系。
聚合(Aggregation)
聚合是一种带有特殊语义的关联关系,关联关系双方并不强调层级关系(我和朋友是同级的),但是聚合关系是强调层级关系的。
聚合关系用一条带空心菱形箭头的直线表示。
自然语言描述的例子:公司和员工就是聚合关系,有明确的层级。
聚合关系在代码中的体现也是成员变量。
组合关系(composition)
组合关系也是一种特殊的关联关系,组合关系表示整体和部分的生命周期都是相同的,而聚合和关联都不关注生命周期。
例如,公司和部门,部门不会独立于公司存在,公司也不会没有部门,一个部门也不会属于不同的公司。
组合关系用一条带实心菱形箭头直线表示。
实例
- 车的类图结构为<<abstract>>,表示车是一个抽象类;
- 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
- 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
- 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
- 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
- 学生与身份证之间为关联关系,使用一根实线表示;
- 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;
工程实践
类图的概念上面已经说完了,这里说一下在具体的面向对象建模过程中,类图应该如何产出(参考《软件工程(第四版)》)。
注意不要教条主义,这只是一个参考的指导思想,具体实践还是需要结合实际。
0.前期设计准备
这一块比较大,包含需求分析、领域划分等,一时也没法说清楚,这里就略过了。
1.识别系统名词
标识出来自问题域的相关对象类,对象类包括物理实体和概念。所有类在应用中都必须有意义。
首先是从需求陈述中找出所有的名词,将它们作为类—对象的初步候选者,根据以下标准,去掉不正确和不必要的类:冗余类、不相关的类、模糊类等。
最终识别到的每个名词都可以作为一个类。
将识别出的所有名词整理到系统名词表,就可以作为类图的大纲来使用。
2.准备数据字典
为所有建模实体准备一个数据词典,准确描述各个对象类的精确含义,描述当前问题中的类的范围,包括对类的成员、用法方面的假设或限制等。
其实也就是识别每一个类的成员和方法。
3.确定关系
识别完毕类和数据字典之后,再根据系统设计,识别类之间的相互关系。这个关系就是指上述的依赖、关联、聚合、组合等关系。
注意这里并不包含泛化、实现等关系
4.使用继承来细化对象类
这一步就是在上一步的基础上,分析类之间的关联,进行一些抽象设计。
通常可以用下面两种方式来进行:
一是自底向上通过把现有类的共同性质一般化为父类,寻找具有相似的属性、关联或操作的类来发现继承。
二是自顶向下将现有类细化为更具体的子类。
5.完善对象模型
对象模型不可能一次就能保证模型是完全正确的,软件开发的整个过程是一个不断完善的过程。模型的不同组成部分多半是在不同阶段完成的。如果发现模型的缺陷,就必须返回前期阶段进行修改。
实际情况
代码写完了,照着类图的基本元素的说明,画出类图,over。
书写工具
plantuml
https://plantuml.com/zh/class-diagram
一种文本化的uml书写工具,可以用类似写代码的方式画出uml图。
实例:
@startuml
class Car Driver - Car : drives >
Car *- Wheel : have 4 >
Car -- Person : < owns @enduml
实际效果
Draw.io
免费、开源的绘图工具,可以方便的画各种uml图。
推荐下载桌面离线版
uml-类图书写指南的更多相关文章
- 面向对象的照妖镜——UML类图绘制指南
1.前言 感受 在刚接触软件开发工作的时候,每次接到新需求,在分析需求后的第一件事情,就是火急火燎的打开数据库(DBMS),开始进行数据表的创建工作.然而这种方式,总是会让我在编码过程中出现实体类设计 ...
- 转:深入浅出UML类图(具体到代码层次)
深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...
- 深入浅出UML类图(一)
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
- 深入浅出UML类图
原作者:http://www.uml.org.cn/oobject/201211231.asp 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作&l ...
- 深入了解UML类图
深入浅出UML类图 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the ...
- UML类图应该怎么看?
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 我每次写博基本都是这样开头,除了激励自己,每句话也都挺有道理! 呵呵,今天是阴历2017年我工 ...
- 【转】深入浅出UML类图
转自:http://www.cppblog.com/API/archive/2013/07/04/201506.html 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin ...
- UML类图介绍以及PlantUML使用方法
类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...
- 再学UML-深入浅出UML类图(一)
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
- 架构-UML类图
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...
随机推荐
- 日志管理-log4j与slf4j的使用
一.概述 1.log4j: Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Sy ...
- Navicat Premium连接Oracle数据库
记录一下本次配置过程中遇到的问题: 一.服务名 1.找到tnsnames.ors文件: 二.Navicat自带的oci.dll文件版本可能和Oracle数据库不一致,所以使用oracle自带的oci. ...
- oracle中使用pl/sql进行的文件读写操作
第一次知道,可以使用pl/sql来进行文件的读写操作,嘿嘿,简单的试了下可行. 基本步骤如下: SQL> conn sys/sys@orcl as sysdba 已连接. SQL> cre ...
- AtomicXXX系列类使用分析
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 在java.util.concurrent.atomic ...
- java 多线程 快速入门
------------恢复内容开始------------ java 多线程 快速入门 1. 进程和线程 什么是进程? 进程是正在运行的程序它是线程的集合 进程中一定有一个主线程 一个操作系统可以有 ...
- 18.Python模块包(pycharm右键创建文件夹和python package的区别)中__init__.py文件的作用
原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了.当 ...
- JS 中检测数组的四种方法
今天和大家分享一下 JS 中检测是不是数组的四种方法,虽然篇幅不长,不过方法应该算是比较全面了. 1. instanceof 方法 instanceof 用于检测一个对象是不是某个类的实例,数组也是一 ...
- 从 posix_spawn() 函数窥探漏洞逃逸
posix_spawn() 函数是用来在Linux上创建子进程的,头文件是 #include <spawn.h> ,语法如下: #include <spawn.h> int p ...
- QGIS WGS84转其它坐标系并计算坐标
需求: 将带有经度.纬度(WGS84坐标系)坐标的文本(*.txt)转换成指定投影坐标系的shp文件并计算x,y坐标. 环境和工具: WIN10.QGIS2.16.带有经纬度坐标的文本.格式如下图: ...
- 递推 dp - 求有多少个序列符合题意
题目描述 小美有一个由n个元素组成的序列{a1,a2,a3,...,an},她想知道其中有多少个子序列{ap1,ap2,...,apm}(1 ≤ m ≤ n, 1 ≤ p1 < p2 , ...