UML之修饰符

news/2024/12/22 10:34:36/文章来源:https://www.cnblogs.com/gtyan/p/18621886

1.可见性修饰符
面向对象思想中有一个重要概念是封装,封装意味着对象中成员的“可见性”是不同的。这里的对象通常指类和包,而它们的可见性通过可见性修饰符进行定义。
在UML中,类对象成员的可见性修饰符有四种,其具体说明如下:

修饰符 可见性 说明
+ 公共 成员属性、行为、值能够被任何对象看到、引用或调用
- 私有 成员仅能在当前类的实例内被访问
# 保护 成员在当前类及其派生类的实例内被访问
~ 同一包内的同级元素可访问

类成员的前三种可见性比较容易理解,它与面向对象的编程语言中的含义是一致的,而最后的“包可见性”要结合包进行理解,可以结合以下包的可见性描述一并进行理解。
包与可见性有着密不可分的关系,与包相关的可见性说明如下:

修饰符 可见性 说明
+ 公共 具有公共可见性的成员对所有可以访问当前包的内容的元素都是可见的
- 私有 具有私有可见性的成员仅在当前包内可见
# 保护 具有受保护可见性的成员对与拥有它的命名空间具有泛化关系的元素是可见的(在继承元素中可见)。不允许在包或由包直接拥有的元素上使用。包不支持泛化/专门化。
~ 具有包可见性的成员在其最近的封闭包(假设任何中间拥有元素具有适当的可见性)内部是可见的。在其最近的封闭包或标记为具有包可见性的元素之外是不可见的。不允许在包或包直接拥有的元素上使用。

上述说明文字比较晦涩,难于理解,下面我们通过两个示例来进行理解。
先看下图示例,包pkg1包含有三个元素:公共类Book、私有对象myBook及子包pkg2。它们的可见性分别被定义为公共、私有和公共。也就是说在包pkg1之外,可以看到类Book和包pkg2,而看不到对象myBook,但在包pkg1之内,这三个元素相互之间则都是可见的。

而在实际应用中,情况远比上述示例复杂,假想有如下图所示的包pkg1及子包pkg2,它们又各自包含了一些元素,这些元素之间的可见性又是什么样的呢?

为了方便起见,我们用以下表格来说明各元素之间的可见性。表格第一行是主动尝试去看其他元素的发起者,表格第一列是被看元素,在表格中我们则分别用Y和N分别表示被看元素相对主动元素的可见或不可见。

主动元素/被看元素 C1 C2 C3 C4
-C1 - N N N
-C2 N - Y Y
+C3 Y Y - Y
C4 N N N -
+a1 Y Y Y Y
-a2 N N Y N
~a3 N Y Y Y
#a4 N N Y Y

对位于包pkg1中的C1,它只能访问包pkg2中的公共元素,因而它可以看见类C3;同时由于C3的属性a1是公共的,因此C1也可以访问到a1。
对位于包pkg2中的类C2,由于C1是包pkg1中的私有元素,因而它看不到;C3是同一个包中的公共元素,所以对C2可见,类似地,C3的公共属性a1对C2也是可见的;C3的属性a3的可见性被声明为包可见,故而它对同一包中的C2是可见的;同一个包中的C4由于未定义可见性,因而它对C2不可见。
对位于包pkg2中的类C3,同样看不到pkg1中的私有元素C1;而同在包pkg2中的C2对它可见;属性a1、a2、a3、a4均是类C3的成员,故均对C3可见。
对位于包pkg2中的类C4,其他元素对它的可见性与对C2的可见性类似;不过由于C4是C3的继承类,因而C4还可以看见C3中的保护成员a3。
2.修改保护/只读(readOnly & query)
对象的属性除了可见性外,在有些场景下,它还需要具备防止被修改的特性。例如很多系统中都会存在有“用户”对象,在定义代表用户的类user时,它会包含有一些属性,其中代表用户姓名的name、出生日期的birthdate等属性,很显然在对象实例中这些属性一旦被赋值,就应当不允许再改变。为了达到此目的,通常可以将这些属性的可见性设定为私有的,但在对象内,依然可以改变这些属性的值,更有效的方法是在属性名后添加“{readOnly}”,它表示该属性一旦被赋值,将不可改变。
类似地,类的操作其实也可从是否修改属性值的角度分为两类,其中一类是仅通过对属性的计算返回一个值而不会去改变任何属性的值,这样的操作在UML中称作查询,这也可以通过在操作后添加“{query}”进行标示。
以下是一个使用{readOnly}和{query}的示例。

3.参数方向(in/out/inout/return)
操作参数可以指定它的传递方向,它有如下4个可能的修饰符:
In:参数值由调用者传入,操作结束后其值不变
Inout:参数值由调用者传入,再由操作传出,操作结束后其值可能发生变化
Out:参数值由操作传出
Return:作为返回值传递给调用者
上述说明应当比较容易理解,以下是使用这些符号的一个示例:
billcc( in CCN:String,
in owner:NameType,
inout debit:Currentcy,
out successFlag:Boolean
) return ReturnType
上述操作的前两个参数CNN和owner被指定为in参数,即它们在调用操作时应当被赋值且该操作不会改变它们的值;第三个参数debit被指定为inout参数,即在调用操作前它应当被赋值,调用操作后它的值可能被改变;第四个参数successFlag被指定为out参数,即调用操作前它的值无关紧要,操作不会使用它,但操作会在执行过程中设定它的值,并且在操作完成后可以取得其值。
上述操作也指定了返回值类型为ReturnType,它可用于表明操作失败的原因,例如没有发现卡号、I/O或者网络错误等等。需要说明的是,在面向对象的分析与设计中,这类错误更合适的做法是通过抛出异常进行处理。
参考文献:
1.《OCUP 2 Certification Guide_ Preparing for the OMG Certified UML 2.5 Professional 2 Foundation Exam》 Michael Jesse Chonoles
2.《OMG® Unified Modeling Language® (OMG UML®) Version 2.5.1》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856707.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next.js项目中.eslintrc.js的配置

print hello world!module.exports = {// 扩展配置,包含Next.js的核心Web Vitals插件和TypeScript支持插件等extends: [next/core-web-vitals, plugin:@typescript-eslint/recommended, plugin:import/recommended, prettier],rules: {// 关闭jsx-a11y插件的alt-text规则,通常…

nginx-tengine-invalid IPv6 address in resolver-解析器中无效的IPv6地址

问题描述:解析器中无效的IPv6地址 [root@dm ~]# nginx -t nginx: [emerg] invalid IPv6 address in resolver "[fe80::1%em2]" in /usr/local/tengine/conf/nginx.conf:175 nginx: configuration file /usr/local/tengine/conf/nginx.conf test failed 排查流程:查…

解锁 Git Log 更多实用技巧

目前,在软件开发的协作中,Git 无疑是版本控制的王者。 而其中的 git log 命令,犹如一把强大的历史探寻之剑,能够帮助我们深入洞察项目的演进历程。 本篇将为大家整理解读几个实用的 git Log 技巧,让你的项目管理和代码审查工作如虎添翼。 1. 挖掘代码深处的历史变更 git l…

less7(未完)

1.布尔盲注: 正常回显:You are in.... Use outfile...... 报错:You have an error in your SQL syntax 测试注入点: ?id=1 #报错 ?id=1 and 1=1%23 #报错,单引号注入,是字符型 ?id=1))%23 #单引号加了两个括号后正常回显,找到注入点测试列数:3列 ?id=1)) order by 4%23 ?i…

使用HTML5实现一个倾斜的图片增效果

在HTML5和CSS3中,你可以使用CSS3的transform属性来实现图片的倾斜效果。以下是一个简单的例子: HTML: <div class="image-container"><img src="your-image.jpg" alt="Your Image" class="tilted-image"> </div>C…

全面了解智能电网背后的原理

无法直接展示文件的内容但我可以帮助你创建一个简单的结构用于文章展示在这个示例中我们将按照主题和章节结…………无法直接展示 HTML 文件的内容,但我可以帮助你创建一个简单的 HTML 结构用于文章展示。在这个示例中,我们将按照主题和章节结构组织文本内容。 下面是一个HTM…

使用CSS3实现立体图片旋转的特效

要使用CSS3实现立体图片旋转的特效,你可以利用transform属性,该属性允许你对元素进行旋转、缩放、倾斜或平移等操作。以下是一个简单的示例,展示了如何使用CSS3实现一个立体图片旋转的效果:HTML结构:<!DOCTYPE html> <html lang="en"> <head>…

过滤器Filter vs 拦截器Interceptor

过滤器Filter JavaWeb三大组件之一,可以把对资源的请求拦截下来,实现一些特殊功能,比如登录校验、统一编码处理、敏感字符处理等拦截器 Interceptor 概念:一种动态拦截方法调用的机制,类似于Filter,Spring框架提供,用于动态拦截控制器方法的执行 作用:拦截请求,在指定…

正确停止Oracle expdp/impdp作业操作方法

1、使用命令查看在运行的作业名称,找到STATE是EXECUTING的作业名称。 select job_name,state from dba_datapump_jobs; 2、再CMD命令窗口,键入以下命令,等号后面是要结束的任务名称,前面是数据库连接信息,注意 \"是转义符合不能省略 expdp \"his/Funk360@orcl\&…

读图数据库实战笔记10图分析

图分析1. 图分析 1.1. 图分析和机器学习(ML)是进一步探索图时要探索的两个最常见领域 1.2. 寻路1.2.1. 每一个特定的寻路算法的工作原理都略有不同,并且各有优缺点1.2.2. 测向1.2.2.1. 地理制图工具使用寻路算法的一些变体来提供方向1.2.3. 优化问题1.2.3.1. 寻路算法可以优…

dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用

本文将和大家简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用和代表的含义熟悉文本排版的伙伴也许对于字体的 Metrics 概念不陌生,在 Skia 里面提供的 SKFontMetrics 就包含了从字体信息里面所获取的多项信息。只是略微有所不同的是 Skia 多加了对字体大小的加工,即 SKFont…

LVGL 移植到 STM32 通法 ( 例:LVGL 9.2.2 到 STM32F429 )

心法: 以往看过很多的移植教程、在 Keil 里面添加很多的文件分组、进到 LVGL 源码文件夹,进进出出多级目录添加很多的源码文件、这个添加,那个不需要添加,着实吓人 + 劝退人。1. Keil 里面的文件分组的 组织结构、取名对编译根本不重要,只是方便程序员管理文件。 不过要注…