说明

类图是最常用的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图。

https://www.draw.io/

推荐下载桌面离线版

uml-类图书写指南的更多相关文章

  1. 面向对象的照妖镜——UML类图绘制指南

    1.前言 感受 在刚接触软件开发工作的时候,每次接到新需求,在分析需求后的第一件事情,就是火急火燎的打开数据库(DBMS),开始进行数据表的创建工作.然而这种方式,总是会让我在编码过程中出现实体类设计 ...

  2. 转:深入浅出UML类图(具体到代码层次)

    深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN   在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...

  3. 深入浅出UML类图(一)

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

  4. 深入浅出UML类图

    原作者:http://www.uml.org.cn/oobject/201211231.asp 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作&l ...

  5. 深入了解UML类图

    深入浅出UML类图 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the ...

  6. UML类图应该怎么看?

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 我每次写博基本都是这样开头,除了激励自己,每句话也都挺有道理! 呵呵,今天是阴历2017年我工 ...

  7. 【转】深入浅出UML类图

    转自:http://www.cppblog.com/API/archive/2013/07/04/201506.html 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin ...

  8. UML类图介绍以及PlantUML使用方法

    类的UML表示方法 UML介绍 类图,是UML(统一建模语言)中用于描述"类"以及"类与类"之间的示意图.它形象的描述出了系统的结构,帮助人们理解系统. 类图是 ...

  9. 再学UML-深入浅出UML类图(一)

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

  10. 架构-UML类图

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

随机推荐

  1. 20191024-2 Alpha阶段贡献分配

    此作要求参见: https://edu.cnblogs.com/campus/nenu/2019fall/homework/9858 要求1 每位组员的贡献分值 罗杨美慧:9 徐丽君:11 魏鑫:12 ...

  2. 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...

  3. Elasticsearch 节点磁盘使用率过高,导致ES集群索引无副本

    目录 一.问题 二.问题的原因 三.问题解决的办法 1. 扩大磁盘 2. 删除部分历史索引 3. 更改es设置 四.扩展 一.问题 最近在查看线上的 es,发现最近2天的索引没有副本,集群的状态也是为 ...

  4. Linux开发环境及应用—《第五周单元测验》《第六周单元测验》

    1.与windows中"格式化磁盘"功能相对应的Linux命令是 mkfs 2.在Linux文件系统中,文件名也存放在磁盘上,存放于磁盘的下述哪个区域 文件存储区 3.传统Linu ...

  5. js中的事件委派

    在介绍JS中事件委派之前先来看看一个简单的需求:为每一个超链接绑定一个单击响应函数并在控制台打印一句话,内容是:” a 标签的单击响应函数“.下面是这个需求的代码: <!DOCTYPE html ...

  6. 设置本地上网IP

    在局域网中,我们经常需要根据网络连接环境来对本地连接的IP地址进行手动设置,那么如何对IP地址进行设置呢?下面小编就把教程介绍给大家. 1. 右击桌面“网上邻居”->选择“属性”,打开“网络共享 ...

  7. js判断各种类型

    js的六种基本类型:Object,Boolean,Number,String,Undefined,Null; Object中又有:Function,Array,Date... 如何判断数据类型? Ob ...

  8. Dockerfile文件记录(用于后端项目部署)

    Dockerfile文件记录(用于后端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理) 此文结合另一篇博客共同构成后端服 ...

  9. cogs 886. [USACO 4.2] 完美的牛栏 二分图 匈牙利算法

    886. [USACO 4.2] 完美的牛栏 ★★☆   输入文件:stall4.in   输出文件:stall4.out   简单对比时间限制:1 s   内存限制:128 MB USACO/sta ...

  10. CentOS6.8 LAMP

    第一次配置LAMP运行环境,上网查询了很多资料,一边试命令一边学习.服务器重置了很多次. 虽然有OneinStack这个方便的网站一键命令部署,但知道这个网站却是我自己踩坑之后的事情了,故此记录. 1 ...