九、面向对象方法学引论
面向对象方法学的出发点和原则是尽可能模拟人类思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,使描述空间的问题域与求解域在结构上保持一致。
面向对象方法的四个要点:
- 认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。
- 把所有对象都划分为类,每个对象都定义了一组数据和一组方法
- 按照子类与父类的关系,把若干个对象组成一个层次结构的系统
- 对象仅能通过传递消息互相联系
综上所述,面向对象方法学可由以下公式概括:
OO=objects+classes+inheritance+communication with messages
也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。
优点:
-
与人类思维方法一致
-
稳定性好
-
可重用性好
-
较易开发大型软件产品
-
可维护性好
为啥可维护性好?
- 面向对象软件的稳定性好
- 面向对象的软件容易修改
- 面向对象的软件容易理解
- 易于测试和调试
面向对象的概念
对象
面向对象方法学中的对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。对象可以作的操作表示它的动态行为。
特点:
- 以数据为中心
- 对象是主动的
- 实现了数据封装
- 本质上具有并行性
- 模块独立性好
类
类是对具有相同属性和行为的一个或多个对象的描述。
实例
实例就是由某个指定类型所描述的一个具体对象。
消息
消息就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明,一般由下述三部分组成
- 接受消息的对象
- 消息选择符(消息名称)
- 零个或多个变原
方法
方法就是对象所能执行的操作,也就是类中所定义的服务。
属性
属性就是类中所定义的属性,它是对客观世界实体所具有的性质的抽象。
封装
封装是把数据和实现操作的代码集中起来放在对象内部。封装也就是信息隐藏,通过封装对外界隐藏了对象的实现细节。
特点:
a.有一个清晰的边界
有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。
b.有确定的接口(即协议)
这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。
c.受保护的内部实现
实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。
继承
在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。
特点:
a. 继承具有传递性;
b. 低层的性质将屏蔽高层的同名性质。
多态
多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。即在类等级的不同层次中可以共享一个方法的名字,不同层次中的每个类各自按自己的需要来实现这个行为。
重载
这里有两种重载。
a. 函数重载
在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。
b. 运算符重载
同一个运算符可以施加于不同类型的操作数上面。
当参数特征不同或被操作数的类型不同时,实现函数的算法或运算符的语义是不相同的。
重载提高了面向对象系统的灵活性和可读性。
面向对象建模
模型
模型是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。
作用:
① 模型是一种思考工具,利用这种工具可以把知识规范地表示出来。
② 模型可以帮助人们思考问题、定义术语、在选择术语时作出适当的假设,并且有助于保持定义和假设的一
致性。
模型分类:
(1)对象模型:
描述系统数据结构。
(2)动态模型:
描述系统控制结构。
(3)功能模型:
描述系统功能。
对象模型
对象模型表示静态的、结构化的系统的数据性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。对象模型为建立动态模型和功能模型,提供了实质性的框架。
通常使用UML提供的类图建立对象模型。
符号
(1)定义类
UML中类的图形符号为长方形,用两条横线把长方形分戒上、中、下3个区域,3个区域分别放类的名字、
属性和服务。
定义类名应该遵守以下准则:
a. 使用标准术语。应该使用在应用领域中人们习惯的标准术语作为类名,不要随意创造名字。
b. 使用具有确切含义的名词。尽量使用能表示类的含义的常用语作名字,不要使用空洞的或含义模糊的
词作名字。
c. 必要时用名词短语作名字。为使名字的含义更准确,必要时用形容词加名词或其他形式的名词短语作名
字。
注意:类名应该是富于描述的、简洁的而且无二义性的。
(2)定义属性
UML描述属性的语法格式如下:
可见性 属性名:类型名=初值{性质串}
①可见性
属性的可见性分为公有的(+)、私有的(-)和保护的(#),如果未声明可见性,则表示该属性的可见性尚
未定义。
注意:没有默认的可见性。
② 类型名
表示该属性的数据类型,它可以是基本数据类型或是是用户自定义的类型。属性名和类型名之间用冒号(:)
分隔。
③ 赋值
在创建类的实例时应给其属性赋值,如果给某个属性定义了初值,则该初值可作为创建实例时这个属性的默
认值。类型名和初值之间用(=)隔开。
④ 性质串
性质串明确地列出该属性所有可能的取值,不同值之间用逗号隔开。性质串用花括号({))括起来。
(3)定义服务
服务也就是操作,UML描述操作的语法格式如下:
可见性 操作名(参数表):返回值类型{性质串}
① 可见性
操作的可见性分为公有的(+)、私有的(-)和保护的(#),如果未声明可见性,则表示该操作的可见性尚未定义。
注意:没有默认的可见性。
② 参数表
用逗号分隔的形式参数的序列。描述一个参数的语法如下:
参数名:类型名=默认值
在类中也可以定义类作用域操作,在类图中表示带下划线的操作。这类操作只能存取本类的类作用域属性。
关系
类与类间通常有关联、泛华(继承)、依赖和细化四种关系。
1、关联
关联表示两个类的对象之间存在某种语义上的联系。
(1)普通关联
普通关联是最常见的关联关系,只要在类与类之间存在连接关系就可以用普通关联表示。
第一,普通关联的图示符号是连接两个类之间的直线。
第二,关联是双向的,可为关联起一个名字。在名字前面(或后面)加一个表示关联方向的黑三角。
第三,在表示关联的直线两端可以写上重数,它表示该类有多少个对象与对方的一个对象连接。未明确标出关联的重数,则默认重数是1。
如上图,一个作家可以使用一到多台计算机,一台计算机可以被0至多个作家使用。
(2)限定关联
限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或从多对多简化成多对一。
在类图中把限定词放在关联关系末端的一个小方框内。如图9-7所示,利用限定词“文件名”表示了目录与
文件之间的关系,利用限定词把一对多关系简化成了一对一关系。
意义:限定提高了语义精确性,增强了査询能力。
(3)关联类
为了说明关联的性质,可能需要一些附加信息。关联类可以用来记录相关信息。
关联中的每个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。
2、聚集
聚集(聚合)是关联的特例。表示类与类之间的关系是整体与部分的关系。在陈述需求时使用的“包含"、“组成"、“分为……部分”等字句,往往意味着存在聚集关系。除了一般聚集之外,还有两种特殊的聚集关系,分别是共享聚集和组合聚集。
(1)共享聚集
如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。
一般聚集和共享聚集的图示符号,都是在表示关联关系的直线末端紧挨着整体类的地方画一个空心菱形。
(2)组合聚集
如果部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失,则该聚集称为组合聚集
(组成)。
组成关系用实心菱形表示。
3、泛化
(1)普通泛化
没有具体对象的类称为抽象类。抽象类通常都有抽象操作,作用来指定该类的所有子类应具有哪些行为。表示抽象类是在类名下方附加一个标记值(abstract),表示抽象操作是在操作标记后面跟随一个性
质串(abstract) 。
(2)受限泛化
定义
可以给泛化关系附加约束条件,以进一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。
约束:
预定义的约束有4种:多重、不相交、完全和不完全。这些约束都是语意约束。
继承分类:
第一,多重继承
一个子类可以同时多次继承同一个上层基类。
第二,不相交继承
一个子类不能多次继承同一个基类。一般的继承都是不相交继承。
第三,完全继承
父类的所有子类都已在类图中穷举出来了。
第四,不完全继承
父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护。是默认的继承关系。
4、依赖和细化
(1)依赖
依赖关系描述两个模型元素之间的语义连接关系:其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。
上图表示了一个友元依赖关系。
在UML类图中用带箭头的虚线连接有依赖关系的两个类,箭头指向独立的类。在虚线上可以带一个版类标签,具体说明依赖的种类。
(2) 细化
对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。
细化的图示符号为由元素B指向元素A的一端为空心三角形的虚线。
动态模型
1、概念
动态模型表示瞬时的、行为化的系统的控制性质,它规定了对象模型中的对象的合法变化序列。
2、建模
用UML提供的状态图来描绘对象的状态、触发状态转换的事件以及对象的行为。每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型,即动态模型是基于事件享
而互相关联的一组状态图的集合。(第三章状态转换图)
功能模型
功能模型表示变化的系统的功能性质,它指明了系统应该做什么,因此更直接地反映了用户对目标系统的需求。在面向对象方法学中,我们一般使用UML提供的用例图进行需求分析和建立功能模型。
① 系统
a. 定义
系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例模型来说都是不重要的。
b. 表示
系统用方框表示,其边线表示系统的边界,用于划定系统的功能范围,定义了系统所具有的功能。描述该系统功能的用例置于方框内,代表外部实体的行为者置于方框外。
② 用例
a.定义
一个用例是可以被行为者感受到的、系统的一个完整的功能。在UML中把用例定义成系统完成的一系列动作。
b. 表示
在UML中,椭圆代表用例。用例通过关联与行为者连接,关联指出一个用例与哪些行为者交互,这种交互是双向的。
c. 特征
第一,用例代表某些用户可见的功能,实现一个具体的用户目标。
第二,用例总是被行为者启动的,并向行为者提供可识别的值。
第三,用例必须是完整的。
注意:用例是一个类,它代表一类功能而不是使用该功能的某个具体实例。用例的实例是系统的一种实际使用方法,通常把用例的实例称为脚本。脚本是系统的一次具体执行过程。
③行为者
a. 定义
行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。行为者代表一种角色,而不是某个具体的人或物。
b. 表示
在UML中,线条人代表行为者。在用例图中用直线连接行为者和用例,表示两者之间交换信息,称为通信联系。行为者触发用例,并与用例交换信息。单个行为者可与多个用例联系,一个用例也可与多个行为者联系。
④用例间的关系
UML用例之间主要有扩展和使用两种关系,它们是泛化关系的两种不同形式。
扩展关系
a.扩展关系
向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一
些行为,通常把后者称为扩展用例。用例之间的扩展关系图示为带版类《扩展》的泛化关系。
b. 使用关系
一个用例使用另一个用例时,这两个用例之间就构成了使用关系。如用例之间的使用关系用
带版类《使用》的泛化关系表示。
c. 两种关系的异同
第一,都是从几个用例中抽取那些公共的行为并放入一个单独的用例中,而这个用例被其他用例使用或扩展。
第二,使用和扩展的目的是不同的。在描述一般行为的变化时采用扩展关系。
第三,在两个或多个用例中出现重复描述又想避免这种重复时,釆用使用关系。
3种模型之间的关系
- 三种模型
(1) 三种模型相互补充、相互配合,使得人们对系统的认识更加全面。
(2) 对象模型是最基本最重要的,它为其他两种模型奠定了基础。 - 关系
(1) 针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。
(2) 状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时
与类图中的服务相对应。
(3) 功能模型中的处理对应于对象模型中的类所提供的服务。
(4) 数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的对象。
(5) 数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个对象。
(6) 用例图中的行为者,可能是对象模型中的对象。
(7) 功能模型中的处理可能产生动态模型中的事件。
(8) 对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构。
课后题
1、
答:(1)面向对象方法学是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类解决
问题的方法与过程,使描述问题的问题空间与实现解法的解空间在结构上尽可能一致的方法学科。
(2)面向对象方法学优点:
① 与人类习惯的思维方法一致。
② 面向对象软件稳定性好。
③ 面向对象软件可重用性好。
④ 较易开发大型软件产品。
⑤ 可维护性好。
2、
答:(1)对象是对问题域中某个实体的抽象。
(2)相对于传统数据结构的静态被处理,对象既有静态的属性,也有动态的行为,是进行处理的主体。
3、
答:类是对具有相同数据结构和相同操作的一组组相似对象的定义,即类是对具有相同属性和行为的一个或
多个对象的描述,包括对怎样创建该类的新对象的说明。
4、
答:继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子
类自动地共享基类中定义的数据和方法的机制。
5、
答:
(1)模型是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。模型由一组图
示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。模型是一种思考工具,利用这种工具可以把知识规范地表示出来。
(2)由于建模忽略了事物的非本质属性,因此模型比原始事物更容易操作。对于那些因过分复杂而不能直
接理解的系统,特别需要建立模型,模型通过吧系统的重要部分分解成人的头脑一次能处理的若干个子部分,从而减少了系统的复杂程度。
6、
答:(1)对象模型表示静态的、结构化的系统的数据性质。它是对模拟客观世界实体的对象以及对象彼此间
的关系的映射,描述了系统的静态结构。
(2) 通常使用UML提供的类图来建立对象模型。
(3) 在UML中“类”的实际含义是。一个类以及属于该类的对象。
7、
答:
(1)动态模型表示瞬时的、行为化的系统的控制性质,它规定了对象模型中对象的合法变化序列。
(2) 在UML中,使用状态图和事件追踪图来建立动态模型。
(3) 其符号的含义为:
① 状态图表示需要考察的对象的动态行为。
② 事件追踪图表示其运行规律和行为规则。
8、
答:
(1)功能模型表示软件系统的功能性质,它指明了系统应该“做什么",因此更直接地反映了用户对目
标系统的需求。
(2)在UML中主要使用用例图来建立功能模型,一幅用例图包括的模型元素有系统、行为者、用例以及
从而减少了系统的复杂程度。