Coding中UML建模问题释疑
0 目录
- 1 UML
- 2 类图
- 2.1 类的UML表示法
- 2.2 类的关联关系
- 2.2.1 双向关联
- 2.2.2 限定关联
- 2.2.3 单向关联
- 2.2.4 自关联
- 2.2.5 聚合关系
- 2.2.6 组合关系
- 2.3 类的依赖关系
- 2.4 类的泛化关系
- 2.5 接口与实现关系
- 小结
1 UML
软件领域,当前最流行的建模工具当属统一建模语言(Unified ModelingLanguage,UML)。
UML拥有一种定义良好的、富有表现力的表示法,这对软件开发过程非常重要。标准的表示法让分析师或开发者能够描述一个场景、阐明一种架构,并准确地将这些信息告诉别人。
UML分为结构型和行为型建模图形:
2 类图
类(Class)封装了数据和行为,是面向对象的重要组成部分,是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。
类图用于描述类以及它们的相互关系。在分析时,我们利用类图来说明实体共同的角色和责任,这些实体提供了系统的行为。在设计时,我们利用类图来记录类的结构,这些类构成了系统的架构。在类图中,两个基本元素是类,以及类之间的关系。
2.1 类的UML表示法
在UML中,类由包含类名、属性和操作3部分组成,这3部分使用分隔线分隔的矩形表示。例如,定义一个Employee类,包含属性name、age和email,以及操作getName(),在UML类图中,该类如图所示:
对应代码如下:
class Employee {public:void getName() {return name;}
private:string name;int age;string email;
};
其中,可见性、名称和类型的定义分别如下
- 可见性:表示该属性对于类外的元素而言是否可见,包括公有(public)、私有(private)、友元和受保护(protected),在类图中分别用符号+、-、~和#表示。
- 名称:按照惯例,类的名称以大写字母开头,单词之间使用驼峰隔开。属性和操作的名称以小写字母开头,后续单词使用驼峰。
- 类型:表示属性的数据类型,可以是基本数据类型,也可以是用户自定义类型。
2.2 类的关联关系
2.2.1 双向关联
在默认情况下,关联是双向的。例如,一位教师(Teacher)可以教授一或多门课程(Course),一门课程只能被一位教师教授,因此Teacher类和Course类之间具有双向关联关系,如图所示。
在图中,三角形标注表示关联关系的阅读方向,是可选的。直线两边的数字代表关联的重数性(Multiplicity),也是可选的,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或数字范围表示。
对象之间可以存在多种多重性关联的关系,常见的多重性表示方式如下表所示。
2.2.2 限定关联
限定关联(Qualified association)具有限定符(Qualifier),限定符的作用类似HashMap中的键(key),用于从一个集合中选择一个或多个对象。例如,一个用户(User)可以有多个角色(Role),但是在一个场景(Scenario)下,它只会是一种角色。
对于限定关联,有一点需要注意,即多重性的变化。例如,比较如下二图,限定减少了在关联目标端的多重性,通常是由多变为一,因为限定关联通常是从较大集合中选择一个实例。
用代码实现限定关联时,成员变量通常是Map,而Map的键就是限定符。
class User {public:Role getRole(string scenario) {return roles.at(scenario);}
private:map<string, Role> roles;
};class Role {};
2.2.3 单向关联
类的关联关系也可以是单向的,单向关联用带箭头的实线表示。例如,顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系,如图所示。
2.2.4 自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如,一个节点类(Node)的成员又是节点Node类型的对象,如图所示。
设计模式中的装饰者模式也是一种自关联,都有类似如下的代码形式:
class Node {private:Node subNode;
};
2.2.5 聚合关系
聚合(Aggregation)关系表示整体与部分的关联关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。例如,汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此汽车和发动机是聚合关系,如图所示。
在用代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入整体对象中,图对应的代码片段如下:
class Engine {};class Car {private:Engine engine;public:Car(Engine engine) {this.engine = engine;}void setEngine(Engine engine) {this.engine = engine;}
};
2.2.6 组合关系
组合(Composition)关系也表示类之间整体和部分的关联关系,但是在组合关系中,整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有“同生共死”的关系。在UML中,组合关系用带实心菱形的直线表示。例如,人的头部(Head)与嘴(Mouth),嘴是头部的组成部分,如果头部不存在,那么嘴也就不存在了,因此头部和嘴是组合关系,如图所示。
在用代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类。成员对象域整体对象有同样的生命周期,也就是要“共生死”,这也是组合和聚合的主要区别。代码上的体现是组合没有Setter方法,图对应的代码片段如下:
class Mouth {};class Head {private:Mouth mouth;public:Head(){ mouth = new Mouth();}
};
2.3 类的依赖关系
依赖(Dependency)关系是一种使用关系,特定事物的改变可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时,使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。例如,教师(Teacher)上课时使用投影仪(Projector)进行演示,如图所示。
在系统实施阶段,依赖关系通常通过3种方式来实现。
- 第一种方式(也是常用的一种方式)是将一个类的对象作为另一个类中方法的参数,如上图所示
- 第二种方式是在一个类的方法中将另一个类的对象作为其局部变量。
- 第三种方式是在一个类的方法中调用另一个类的静态方法。
第一种方式对应的C++代码片段如下:
class Projector {public:void demonstrate(){}
};class Teacher {public:void use(Projector projector) {projector.demonstratr();}
};
2.4 类的泛化关系
泛化(Generalization)关系也称为继承关系,用于描述父类与子类之间的关系。父类称为基类或超类,子类称为派生类。在UML中,泛化关系用带空心三角形的直线来表示。在代码实现时,我们使用面向对象的继承机制来实现泛化关系。
举例说明,Student类和Teacher类都是Person类的子类,Student类和Teacher类继承了Person类的属性和方法,Person类的属性包含姓名(name)和年龄(age),每一个Student和Teacher也都具有这两个属性。另外,Student类增加了属性学号(studentNo),Teacher类增加了属性教师编号(teacherNo),如图所示。
对应的C++代码片段如下:
class Person {public:string name;int age;...
};class Student : public Person {private:string studentNo;...
};class Teacher : public Person {private:string teacherNo;...
};
2.5 接口与实现关系
面向对象语言中会引入接口的概念。 (一般应用在java中,C++中没有接口概念) 在接口中,通常没有属性,其操作通常都是抽象的,只有操作的声明,没有操作的实现。在UML中,类与接口之间的实现关系通常是用带空心三角形的虚线来表示。例如,每一个度量项(Metrics)都是可度量的(Measurable),其实现如图所示。
需要注意的是,UML提供了多种方法表示接口实现(Interface realization)。例如,在UML 2中新定义的插座表示法(Socket notation),有助于表示“类X需要(使用)接口Y”。在上面的例子中,我们有一个统计类(Statistics)要使用度量项进行统计,其插座表示法如图所示。
小结
整体与部分关系:
- 委托关系(聚合关系):特征是通过指针相连。用空心菱形直线表示。 表示成员是整体的一部分,但是成员对象可以脱离整体对象独立存在。
- 复合关系(组合关系):用实心菱形直线表示。 表示整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象亦不存在。
使用关系:
- 一个事务使用另一个事务,使用带箭头的虚线表示
继承关系:
- 描述父类与子类之间的关系,采用带空心三角形表示。
接口与实现关系:
- 采用带空心三角形虚线表示。
Coding中UML建模问题释疑相关推荐
- 对软件开发中uml建模的理解和图形整理(一)
由于uml(统一建模语言)在开发中经常会用到,特别是在软件开发中的OOAD阶段,因此要理解和使用uml显得尤为重要.在uml开始之前,咱先回顾一个OOAD.OOP的主要特征. OOAD:根据面向对象的 ...
- 浅析软件工程中的UML建模技术
一.基本信息 标题:浅析软件工程中的UML建模技术 时间:2018 出版源:电子世界 领域分类:软件工程:UML建模技术:需求分析 二.研究背景 问题定义:软件工程中UML建模技术的研究 难点:明确软 ...
- 图解Visual Studio 2010中的UML建模功能
Visual Studio 2010在架构和项目管理方面的功能增加让人眼前一亮,之前曾详细介绍过Visual Studio 2010新增的架构工具,包括通过可视化技术DGML提供直观的图表,依赖图,继 ...
- UML建模中的关系画法
UML建模中的关系包括:依赖.泛化.关联.实现.聚合.组合等. 很多人看到UML类图后都看不懂,为什么? 因为基础的关系没有掌握,各个框之间的关系是啥都不明白,怎么能懂类图呢.不管是类图.用例图.指示 ...
- (软考笔记) —— 系统架构设计师 - UML建模与架构文档化
文章目录 UML建模与架构文档化 UML 现状与发展 UML起源 UML 体系结构演变 UML 的应用与未来 UML基础 概述 用例和用例图 交互图 类图和对象图 状态和活动图 状态图 活动图 构件图 ...
- UMLChina: trufun Plato是中国唯一的UML建模工具
在UMLChina最新发布的"厂商"栏目中,Trufun Plato是唯一的中国人自己的UML建模工具:[url]http://www.umlchina.com/Tools/N ...
- (转)轻量级 UML 建模工具JUDE 介绍(二)
[译]Learn UML with JUDE(二) 六. UML about Bowling 现在都准备好了,我们可以开始画diagram了.我们画什么diagram呢?你最近有去打过保龄球吗?我非常 ...
- UML建模系列文章总结
一.为什么要学习UML 二.UML的历史 三.UML的特点 四.UML中的视图 五.UML建模工具 六.UML的应用领域 七.UML的构成 1.需求阶段如何书写Use Case 2.设计阶段如何画用例 ...
- 软件需求工程与UML建模——第九组原型系统总结
自习通原型系统总结文档 目录 一. 功能点概述 二. 前端界面交互功能说明 三. 前后端数据交换功能说明 四. 人员分工说明 五. 进阶需求内容展示 第一部分 功能点实现情况 下图 ...
最新文章
- 纯中文C++代码,可运行
- 白话异常检测算法Isolation Forest
- 湖南科技大学计算机控制技术,湖南科技大学控制理论与控制工程专业
- Spring Framework总览面试题精选
- SU suspecfk命令学习
- anaconda pandas运行不了_学习python你必须弄懂的 Python、Pycharm、Anaconda 三者之间的关系...
- 了解Base64编码的原理(js核对)
- php 进程管理及操作
- 中琛源携手台江县积极践行山区青少年体育公益
- nts包如何下周 php_【Composer】PHP开发者必须了解!(life)
- 基于贝叶斯公式的拼音输入法二元模型实现
- 什么是缓存雪崩、击穿、穿透?
- 009.查找手机电话簿【散列表】
- ASEMI场效应管7N60的极限和静态参数详解
- 见证边缘的力量!全球边缘计算大会•上海站顺利召开!
- 洛谷P2036 PERKET
- 五大算法之动态规划套路详解(1)
- 领导力专题︱聊聊领导力的主要问题
- 初中计算机公开课教学设计,初中信息技术公开课《申请电子邮箱》教案
- 按键精灵DNF脚本开发第二季
热门文章
- SaltStack实战之远程执行-Returners
- 立交匝道中边桩坐标放样正反算程序RAMP
- gltf骨骼动画解析笔记
- 软件体系结构的分析与测试,软件体系结构分析与评价,software architecture analysis and evaluation,音标,读音,翻译,英文例句,英语词典...
- cesium-接入监控视频
- 嵌入式开发<串口调试工具>
- 通过mqtt再利用移动oneNet平台的连接与数据收发
- php读取pdf文件乱码_PHP读取文件,解决中文乱码UTF-8的方法分析
- 群论(Burnside引理和Polya定理)
- gulp:提示:Error: watching html/*: watch task has to be a function (optionally generated by using gulp