OO(object oriented面向对象)
面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP
一、OO - Object-Oriented(面向对象)
对象代表真实或抽象的事物,有一个名字(唯一标识),有明确的职责(well-defined responsibilities),展示良好的行为(well-defined behavior),接口清晰,并且尽可能简单、自相容,内聚,完备(self-consistent,coherent,and complete)。
基于对象概念,以对象为中心,以类和继承为构造机制,来认识,理解,刻画客观世界和设计,构建相应的软件系统的一门方法;本意就是模拟人类的思维方式,使开发,维护,修改更加容易。
面向对象三大机制(特征),即:“封装、继承、多态”
– 封装,隐藏内部实现
– 继承,复用现有代码
– 多态,改写对象行为
二、OOA - Object-Oriented Analysis(面向对象分析)
强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。其实就是进一步对OO进行细化,初步得出该OO的属性与方法(或者简单的理解:在得出的文档中对接口的粗略定义)。
OOA模型由5个层次(主题层、对象类层、结构层、属性层和服务层)和5个活动(标识对象类、标识结构、定义主题、定义属性和定义服务)组成(OOA中的5个层次和5个活动继续贯穿在OOD过程中)。在这种方法中定义了两种对象类之间的结构,一种称为分类结构,一种称为组装结构。分类结构就是所谓的一般与特殊的关系。组装结构则反映了对象之间的整体与部分的关系。
OOA在定义属性的同时,要识别实例连接。实例连接是一个示例与另一个实例的映射关系。
OOA在定义服务的同时要识别消息连接。当一个对象需要向另一个对象发送消息时,它们之间就存在消息连接。
OOA的主要原则:
1、抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫做抽象。抽象原则有两个方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其共同特性而得到一批事物的抽象概念。抽象是面向对象方法中使用最为广泛的原则。抽象原则包括过程抽象和数据抽象两个方面:过程抽象是指,任何一个完成确定功能的操作序列,其使用者都可以把它看做一个单一的实体,尽管实际上它可能是由一系列更低级的操作完成的;数据抽象是根据施加于数据之上的操作来定义数据类型,并限定数据的值只能由这些操作来修改和观察。数据抽象是OOA的核心原则。它强调把数据(属性)和操作(服务)结合为一个不可分的系统单位(即对象),对象的外部只需要知道它做什么,而不必知道它如何做。
2、封装:把对象的属性和服务结合为一个不可分的系统单位,并尽可能隐蔽对象的内部细节。
3、继承:特殊类的对象拥有的其一般类的全部属性与服务,称作特殊类对一般类的继承。
4、分类:就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。分类原则实际上是抽象原则运用于对象描述时的一种表现形式。
5、聚合:又称组装,其原则是:把一个复杂的事物看成若干比较简单的事物组装体,从而简化对复杂事物的描述。
6、关联:是人类思考问题时经常运用的思想方法:通过一个事物联想到另外的事物。能使人发生联想的原因是事物之间确实存在着某些联系。
7、消息通信:这一原则要求对象之间只能通过消息进行通信,而不允许在对象之外直接地存取对象内部的属性。通过消息进行通信是由于封装原则而引起的。在OOA中要求消息连接表示出对象之间的动态联系。
8、粒度控制:一般来讲,人在面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。因此需要控制自己的视野:考虑全局时,注意其大的组成部分,暂时不详查每一部分的具体的细节;考虑某部分的细节时则暂时撇开其余的部分。这就是粒度控制原则。
9、行为分析:显示世界中事物的行为是复杂的。由大量的事物所构成的问题域中各种行为往往相互依赖交织
OOA的主要优点:
1、加强了对问题域和系统责任的理解;
2、改进与分析有关的各类人员之间的交流;
3、对需求的变化具有较强的适应性;
4、支持软件复用;
5、贯穿软件声明周期全过程的一致性、实用性;
6、有利于用户参与。
OOA方法的具体步骤:
在用OOA具体分析一个事物时。大致上遵循如下5个基本步骤;
1、确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界总某些事物的信息能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
2、确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛华—特化关系,整体-部分结构反映整体和局部之间的关系。
3、确定主题(subject)。主题是指事物的总体概貌和总体分析模型。
4、确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在UML图中给出,并在对象的存储中指定。
5、确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在UML图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在UML图上给出),而有些则是显示的。
三、OOD - Object-Oriented Design(面向对象设计)
OOD是OO方法中一个中间过渡环节,其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受 。即是整理和定义OO的属性和方法。
OOD模型由4个部分组成。它们分别是设计问题域部分、设计人机交互部分、设计任务管理部分、和设计数据管理部分。
OOD的 目标是管理程序内部各部分的相互依赖。为了达到这个目标,OOD要求将程序分成块,每个块的规模应该小到可以管理的程度,然后分别将各个块隐藏在接口(interface)的后面,让它们只通过接口相互交流。比如说,如果用OOD的方法类设计一个服务器-客户端(client-server)应用,那么服务器和客户端之间不应该有直接地依赖,而是应该让服务器的接口和客户端的接口相互依赖。这种依赖关系的转换使得系统的各部分具有了可复用性。还是拿上面那个例子来说,客户端就不必依赖于特定的服务器,所以就可以复用到其他的环境下。如果要复用某一个程序块,只要实现必须的接口就行了。
OOD是一种解决软件问题的设计范式(paradigm),一种抽象的范式。使用OOD这种设计范式,则可以用对象(object)来表现问题领域(problem domain)的实体,每个对象都有相应的状态和行为。抽象可以分成很多层次,从非常概括的到非常特殊的都有,而对象可能处于任何一个抽象层次上。另外,彼此不同但又相互关联的对象可以共同构成抽象:只要这些对象之间有相似性,就可以把它们当成同一类的对象类处理。
OOD步骤(据需求决定所需的类、类的操作以及类之间关联的过程):
1、细化重组类;
2、细化和实现类之间关系,明确其可见性;
3、增加属性,指定属性的类型与可见性;
4、分配职责,定义执行每个职责的方法;
5、对消息驱动的系统,明确消息传递的方式;
6、利用设计模式进行局部设计;
7、画出详细的类图和时序图。
OOD设计过程中要展开的主要几项工作:
1、对象定义规格的求精过程
对于OOA所抽象出来的对象&类以及汇集的分析文档,OOD需要有一个根据设计要求整理和求精的过程,是指更能符合OOP的需要。
2、数据模型和数据库设计
数据模型的设计需要确定类与对象属性的内容,消息连接的方式,系统访问,数据模型的方法等。最后每个对象实例的数据都必须落实到面向对象的库结构模型中。
3、优化
OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化,抽象,继承。
四、OOP - Object-Oriented Programming (面象对象编程)
把组件的实现和接口分开,并且让组件具有多态性、继承性、封装性、抽象性。
OOP是一种计算机编程架构,它的一条基本准则是计算机程序是由单个能够引起子程序作用的单元或对象组合而成。OOP达到了软件工程的三个主要目标:重用性,灵活性和扩展性。为了实现整体运算,每个对象都能够接收消息,处理数据和向其它对象发送消息。
OOP主要有以下的概念:
组件:数据和功能一起在运行着的计算机程序中形成的单元,组件在OOP计算机程序中是模块和结构化的基础;
抽象性:程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力(抽象类抽象方法);
封装性:也叫作信息封装,确保组件不会以不可预期的方式改变其它组件内部状态,只有在那些提供了内部状态改变方法的组建中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口。并规定了其它组件进行调用的方法;
多态性:组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的的结果得依据实际调用的类型;
继承性:允许在现存的组件基础上创建子类组件,这统一并强调了多态性和封装性。典型的来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。
附:
OOT - Object-Oriented Testing (面向对象测试)
OOSM - Object-Oriented Software Maintenance(面向对象软件维护)
OOM - Object-Oriented Method(面向对象方法)
OOPL - object-oriented programming language(面向对象的程序设计语言)