第三章 类图:基本概念


类图可用来描写叙述系统中各种对象的类型。也可描绘出对象间各种各样的静态关系。此外。类图中也能够秀出类的性质(property)与操作(operation),以及可应用到对象间连接方式的一些限制(constraint)。在UML中,我们用特性(feature)来代表累的性质与操作这两种概念。


1、性质
性质代表类的结构特性(structural feature)。尽管仅仅是一个概念,只是它却能够用两种很不同的表示法来呈现:属性与关联。
  
2、属性
属性(attributes)表示法用类别四方形中的一行文字来表示性质。

完整语法例如以下:

可见性 名称 : 类型  多重性 =  预设值 { 性质 - 字符串 }
如:
-name:string [1]  = "Untitled"{ readonly }

在整个语法其中,仅仅有【名称】部分是必要的。
(1) 可见性标志代表这个属性是public、private或protect。
(2) 属性的名称大约等同于程序语言中的名称 -它说明类怎样參考这个属性的。

(3) 属性的类型代表一种限制条件,说明属性中到底可放入哪一种对象。
(4) 关于多重性(multiplicity)。稍后再解释它。
(5) 预设值(default value)说明在新产生的对象中,假设产生过程中没有指定值给这个属性,那么我们就会把这个值指定给属性。
(6){性质 - 字符串}同意你指明这个属性的一些额外性质。

3、关联
性质的还有一种表示法是关联。属性中可表示出来的信息,差点儿相同也都能够再关联中表示出来。

关联用两个类别中的实线来表示它,箭头会有来源类指向目标类。性质的名称会出如今关联的目标端,同一时候还会加上它的多重性。

关联的目标端所连接的类就是这个性质的形态。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpZGFvcXE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


一般来说。倾向于把属性用在小的东西上。比如日期或布尔值等,并且他们通常都是值形态的东西。还有一方面,我会把关联用在有显著意义的类上。比如客户或订单。

同一时候,也倾向于用类四方形画出图种有显著意义的类,这也会导致去用关联;还有一方面,我会把不重要的东西表示成属性。

做出这样的选择。目的主要是为了要强调出重点。


4、多重性
性质的多重性代表它可能会有多少个对象存在。

比較一般的说法是我们能够用一个上限与一个下限来定义多重性。

属性的预设多重性是【1】。

尽管UML的超模型中有这条规则存在,只是如果图中某个属性没有标识出多重属性的话,我们不能因此就如果它的多重性为【1】,由于多重性信息能够隐藏起来。


5、双向关联
双向关联代表一对性质。它们从不同方向彼此连接在一起。

例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpZGFvcXE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


Car类中有性质owner:Person[1],而Person类则有性质cars:Car[*]。

6、操作性
操作是类知道该怎样达成的一些动作。非常明显地。操作就是类中的方法(method)。

在UML中,操作的完整语法为:
可见性 名称(參数列表) : 返回类型 { 性质 -字符串 }
(1) 可见性是public、private或protect
(2) 名称是一个字符串
(3) 參数列表是操作会用到的一串參数
(4)返回类型
(5)性质-字符串代表可应用到此操作的一些性质值。

參数列表中的參数是用跟属性类似的方式来表示的。

其语法例如以下:

方向性 名称 : 形态 = 预设值
(1) 名称、形态与预设值跟属性中的都一样。
(2)方向性代表參数是用来输入(in)、输出(out)或输出入(inout)用的。

评注:把会改变跟不会改变类中状态的操作区分开来是很故意的事。

UML中将query(查询)定义成:仅仅会从类中取出值、不会改变系统的状态的操作。也就说,它不会产生副作用。你能够吧这样的操作加上{query}性质字符串。

还有,我自己喜欢将会改变状态的操作加上modifiers(改动)性质字符。


操作指的是我们可呼出对象的某种东西-它代表程序宣告。而方法则是程序本体。这两种东西在多型存在时,会有非常大差异。比如:假设你有一个基类和三个子类,而每一个子类都覆盖基类的getPrice操作。

这时候。我们就有一个操作,四个方法。


7、一般化关系
对一般化关系明显解释就是继承(inheritance)。

在主流的面向对象语言中,子类会继承超类(superclass)的全部类特性,并且还可能会覆盖不论什么超类的方法。


8、相依性
      假设我们该某个元素的定义可能会影响到其它元素,那么这两个元素间就存在着相依性。对类来说相依性存在的原因有好几个:某个类会传送讯息给还有一个类;某个类吧还有一个类当成一部分资料。某个类把还有一个类当成方法中的參数等。
       假设系统不断成长,你必须越来越操心该不论什么去控制相依性。假设你没办法控制相依性的话,那么我们系统所做的不论什么改变都会造成涟漪效应,让越来越多东西跟着改变。

 
表1 本书精心挑选出来一些实用的相依性keyword:
keyword 意义
call 来源元素回去调用目标元素的某个操作
create 来源元素会产生目标元素的实例
derive 来源元素是由目标元素衍生出来的
instantiate 来源元素是目标元素的实例
permit 目标元素同意来源元素去存取目标元素中的私有特性。
realize 来源元素是目标元素中所定义规格或接口的实现
refine 修饰代表不同语义等级间的关系。

substiute 来源元素是可替代目标元素的
trace 我们用这个相依性来追踪一些东西,比如从需求到类的相依性,或某个模型中的变动是怎样练接到其它模型中变动的。

use 来源元素在实现时须要用到的目标元素

一般性原则是尽量减少相依性。特别是相依性会泛滥到系统的一大片区域时。另一点要注意的是:我们应该小心避免循环式相依性,由于它会导致循环性的变动。



9、限制规则
UML同意我们用不论什么东西来描写叙述限制。唯一的规则是:请把限制放在大括号{}内。
有一种选择性的做法是:替限制命名时,把名称放在最前面。后面紧接着一个冒号,像这样{不同意乱伦:夫妻两方不能是兄弟姐妹}

10、何时使用类图
类图是UML的主干,因此你能够发现随时都得到它们。

类别图的最大麻烦在于里面包括太多东西了。所以它们可能会被过度使用。以下是一些使用上的提示:

A、不要试着用到全部能够使用的表示法。先简单用本章所提及的一些东西:包含类别、关联、属性、一般化关系与限制等。

至于高级的东西。仅仅在你认为有须要时再去用它们。


B、我发现到概念性的类图在探索某个企业的领域语言时特别实用。想要这么做时,你必须努力保持不去讨论软件本身,并且尽可能使用很easy的表示法。

C、不要画出包括全部东西的模型。相反地,把重心放在关键地方。持有一些经常使用的到、时时更新的图,比起持有非常多被人遗忘掉、过时的图还好。

使用类图的最大危急在于你可能会过度把焦点放在结构上,而忽略系统中的行为。

《UML精粹》第三章 -类图的基本概念的更多相关文章

  1. UML从需求到实现---类图(2)

    上节写到了UML中的类图:UML从需求到实现---类图(1) 写完以后总觉得写的不够详细.里面很多细节没有说到.一篇文章就把强大的面向对象的类说完.当然是不可能的.这次我再补充一些关于UML中类图和类 ...

  2. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

  3. Java程序设计(2021春)——第三章类的重用笔记与思考

    Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...

  4. UML精粹4 - 对象图,包图,部署图,用例

    对象图object diagram 对象图是某个时间点上的对象在系统中的快照,也经常被称为实例图.一般在展示组合对象结构时比较有用.例如 组合结构的类图 一个时刻的对象图 包图package diag ...

  5. UML从需求到实现---类图(1)

    上次写到了UML的包图,用例等:接上:UML从需求到实现---包图 按照UML中图的出现顺序.当做完包图以后.我们下一步要做的当然是类图,类图也是UML中的三大核心图之一. 看到很多文章在描述类图的时 ...

  6. (转)UML实践----用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图、配置图

    面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...

  7. uml系列(四)——类图

    类图是uml的核心.学习类图,总共须要掌握三个部分:类:类之间的关系:类图怎么画. 首先,类.老规矩,先来张图. 类是什么:举个简单的样例:猫.狗.猪三个都是动物.这里面的"动物" ...

  8. ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式

    一.类图(Class Diagram) 描述一组类.接口.协作已经它们之间的图,用来显示系统中各个类的静态结构图. 类之间的关系(relationship) *依赖(dependency) *泛化(g ...

  9. UML建模—EA创建Class(类图)

    1.新建类图 2.添加类或接口 在类图可以捕获系统-类-和模型组件的逻辑结构.它是一个静态模型,描述存在什么,有哪些属性和行为,而不管如何去做. 说明关系之间的类和接口; 泛化. 聚合和关联是在分别反 ...

随机推荐

  1. leetCode 20.Valid Parentheses (有效的括号) 解题思路和方法

    Valid Parentheses  Given a string containing just the characters '(', ')', '{', '}', '[' and ']', de ...

  2. luogu3386 【模板】 二分图匹配

    基本概念:二分图有两种节点:X节点和Y节点.如果X和Y可以匹配, 则X与Y连着一条边.每个X节点最多只能匹配一个Y节点,同时每个Y节点最多只能匹配一个X节点.最大匹配便是最多的匹配数. 交错路径:交错 ...

  3. identity in sql server 批量插入history

    https://stackoverflow.com/questions/1920558/what-is-the-difference-between-scope-identity-identity-i ...

  4. hdoj--2767--Proving Equivalences (scc+缩点)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

  5. redis动态添加内存,动态配置,无需重启

    在redis的使用过程中,有时候需要急需修改redis的配置,比如在业务运行的情况下,内存不够怎么办,这时要么赶紧删除无用的内存,要么扩展内存.如果有无用的内容可删除那么所有问题都已经解决.如果内容都 ...

  6. encodeURIComponent编码java后台解码出现乱码问题

    问题:JavaScript请求后台带着name参数,有中文进行编码:url?name=" + encodeURIComponent(name):java后台直接使用name或者name=ja ...

  7. SwiftUI 官方教程(五)

    SwiftUI官方教程(五) 5. 同时使用 UIKit 和 SwiftUI 至此,我们已准备好创建 map view 了,接下来使用 MapKit 中的 MKMapView 类来渲染地图. 在 Sw ...

  8. 基于Apache Thrift的公路涵洞数据交互实现原理

    基于Apache Thrift的公路涵洞数据交互实现原理 Apache Thrift简介 Apache Thrift(以下简称为“Thrift”) 是 Facebook 实现的一种高效的.支持多种编程 ...

  9. Centos7下Docker的使用

    一.安装Docker 1.1.查看原有系统是否已经安装docker yum list installed | grep docker 1.2.如果有则不需要继续安装,想重新安装,先卸载 yum -y ...

  10. [Offer收割]编程练习赛39

    公平分队 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #includ ...