更新时间:2022-08-25 11:48
面向对象开发方法将面向对象的思想应用于软件开发过程中,指导开发活动,是建立在“对象”概念基础上的方法学,简称OO( Object-Oriented)方法。面向对象方法的本质是主张参照人们认识一个现实系统的方法,完成分析、设计与实现一个软件系统,提倡用人类在现实生活中常用的思维方法来认识和理解描述客观事物,强调最终建立的系统能映射问题域,使得系统中的对象,以及对象之间的关系能够如实地反映问题域中固有的事物及其关系。
面向对象开发方法认为客观世界是由对象组成的,对象由属性和操作组成,对象可按其属性进行分类,对象之间的联系通过传递消息来实现,对象具有封装性、继承性和多态性。面向对象开发方法是以用例驱动的、以体系结构为中心的、迭代的和渐增式的开发过程,主要包括需求分析、系统分析、系统设计和系统实现四个阶段,但是各个阶段的划分不像结构化开发方法那样清晰,而是在各个阶段之间迭代进行的。
60年代中后期,Simula语言在ALGOL基础上研制开发,它将ALGOL的块结构概念向前发展一步,提出了对象的概念,并使用了类,也支持类继承。70年代,Smalltalk语言诞生,它取Simula的类为核心概念,它的很多内容借鉴于Lisp语言。由Xerox公司经过对Smautalk72、76持续不断的研究和改进之后,于1980年推出商品化的,它在系统设计中强调对象概念的统一,引入对象、对象类、方法、实例等概念和术语,采用动态联编和单继承机制。
从80年代起,人们基于以往已提出的有关信息隐蔽和抽象数据类型等概念,以及由Modula2、Ada和Smalltalk和等语言所奠定的基础,再加上客观需求的推动,进行了大量的理论研究和实践探索,不同类型的面向对象语言(如:Object-c、Eiffel、c++、Java、Object-Pascal等)逐步地发展和建立起较完整的和雨后春笋般研制开发出来,OO方法的概念理论体系和实用的软件系统。
面向对象源出于Simula,真正的OOP由Smalltalk奠基。Smalltalk现在被认为是最纯的OOPL。
正是通过Smalltalk80的研制与推广应用,使人们注意到OO方法所具有的模块化、信息封装与隐蔽、抽象性、继承性、多样性等独特之处,这些优异特性为研制大型软件、提高软件可靠性、可重用性、可扩充性和可维护性提供了有效的手段和途径。
80年代以来,人们将面向对象的基本概念和运行机制运用到其它领域,获得了一系列相应领域的面向对象的技术。面向对象方法已被广泛应用于程序设计语言、形式定义、设计方法学、操作系统、分布式系统、人工智能、实时系统、数据库、人机接口、计算机体系结构以及并发工程、综合集成工程等,在许多领域的应用都得到了很大的发展。1986年在美国面向对象编程
对象是由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)组成的封装体,描述客观事物的一个实体,是构成系统的基本单元。对象的概念贯穿于面向对象开发全过程,即系统就是对象构成的,只是每个阶段对象的具体化程度不一样,这样使各个开发阶段的系统成分良好地对应,显著地提高了系统的开发效率与质量,并大大降低系统维护的难度。同时,对象的相对稳定性和对易变因素隔离,增强了系统的应变能力。
类是对一组有相同数据和相同操作的对象的定义,是对象的模板,其包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其他类,形成类层次结构。
对象通过发送消息的方式请求另一对象为其服务。消息是对象之间进行通信的一种规格说明,一般三部分组成:接收消息的对象、消息名及传递的数据。对象之间传递消息体现问题域中事物间的相互联系。
封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
所谓多态就是指对象根据所接收的消息而做出动作,同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
在面向对象方法中,对象和传递消息分别表现事物及事物间相互联系的概念。
(1) 分析确定在问题空间和解空间出现的全部对象及其属性;
(2) 确定应施加于每个对象的操作,即对象固有的处理能力;
(3) 分析对象间的联系,确定对象彼此间传递的消息;
(4) 设计对象的消息模式,消息模式和处理能力共同构成对象的外部特性;
(5) 分析各个对象的外部特性,将具有相同外部特性的对象归为一类,从而确定所需要的类;
(6) 确定类间的继承关系,将各对象的公共性质放在较上层的类中描述,通过继承来共享对公共性质的描述;
(7) 设计每个类关于对象外部特性的描述;
(8) 设计每个类的内部实现(数据结构和方法);
(9) 创建所需的对象(类的实例),实现对象间应有的联系(发消息)。
(1)强调从现实世界中客观存在的事物(对象)出发来认识问题域和构造系统,使系统能更准确地反映问题域。
(2)运用人类日常的思维方法和原则(体现于OO方法的抽象、分类、继承、封装、消息等基本原则)进行系统开发,有利于发挥人类的思维能力,有效控制系统复杂性。
(3)对象的概念贯穿于开发全过程,使各个开发阶段的系统成分具有良好的对应关系,显著提高系统的开发效率与质量,并大大降低系统维护的难度。
(4)对象概念的一致性,使参与系统开发的各类人员在开发的各阶段具有共同语言,有效地改善了人员之间的交流和协作。
(5)对象的相对稳定性和对易变因素隔离,增强了系统对环境的适应能力。
(6)对象、类之间的继承关系和对象的相对独立性,对软件复用提供了强有力的支持。
面向对象的分析方法(OOA),是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
用OOA方法对所调查结果进行分析处理时,一般依据以下几项原则:
(1)抽象(abstraction)
是指为了某一分析目的而集中精力研究对象的某一性质,它可以忽略其它与此目的无关的部分。在使用这一概念时,我们承认客观世界的复杂性,也知道事物包括有多个细节,但此时并不打算去完整地考虑它。抽象是我们科学地研究和处理复杂问题的重要方法。抽象机制被用在数据分析方面,称之为数据抽象。数据抽象是OOA的核心。数据抽象把一组数据对象以及作用其上的操作组成一个程序实体。使得外部只知道它是如何做和如何表示的。在应用数据抽象原理时,系统分析人员必须确定对象的属性以及处理这些属性的方法,并借助于方法获得属性。在OOA中属性和方法被认为是不可分割的整体。抽象机制有时也被用在对过程的分解方面,被称之为过程抽象。恰当的过程抽象可以对复杂过程的分解和确定以及描述对象发挥积极的作用。
(2)封装
封装(encapsulation)即信息隐蔽。它是指在确定系统的某一部分内容时,应考虑到其它部分的信息及联系都在这一部分的内部进行,外部各部分之间的信息联系应尽可能的少。
(3)继承(inheritance)
是指能直接获得已有的性质和特征而不必重复定义它们。OOA可以一次性地指定对象的公共属性和方法,然后再特化和扩展这些属性及方法为特殊情况,这样可大大地减轻在系统实现过程中的重复劳动。在共有属性的基础之上,继承者也可以定义自己独有的特性。
(4)相关(association)
是指把某一时刻或相同环境下发生的事物联系在一起。
(5)消息通信(communication with message)
是指在对象之间互相传递信息的通信方式。
(6)组织方法
在分析和认识世界时,可综合采用如下三种组织方法(method of organization):特定对象与其属性之间的区别;整体对象与相应组成部分对象之间的区别;不同对象类的构成及其区别等。
(7)比例(scale)
是一种运用整体与部分原则,辅助处理复杂问题的方法。
(8)行为范畴(categories Of behavior)
是针对被分析对象而言的,它们主要包括:基于直接原因的行为;时变性行为;功能查询性行为。
在用OOA具体地分析一个事物时,大致上遵循如下五个基本步骤:
第一步,确定对象和类。这里所说的对象是对数据及其处理方式的抽象,它反映了系统保存和处理现实世界中某些事物的信息的能力。类是多个对象的共同属性和方法集合的描述,它包括如何在一个类中建立一个新对象的描述。
第二步,确定结构(structure)。结构是指问题域的复杂性和连接关系。类成员结构反映了泛化-特化关系,整体-部分结构反映整体和局部之间的关系。
第三步,确定主题(subject)。主题是指事物的总体概貌和总体分析模型。
第四步,确定属性(attribute)。属性就是数据元素,可用来描述对象或分类结构的实例,可在图中给出,并在对象的存储中指定。
第五步,确定方法(method)。方法是在收到消息后必须进行的一些处理方法:方法要在图中定义,并在对象的存储中指定。对于每个对象和结构来说,那些用来增加、修改、删除和选择一个方法本身都是隐含的(虽然它们是要在对象的存储中定义的,但并不在图上给出),而有些则是显示的。
面向对象的设计方法是OO方法中一个中间过渡环节。其主要作用是对OOA分析的结果作进一步的规范化整理,以便能够被OOP直接接受。在OOD的设计过程中,要展开的主要有如下几项工作。
对于OOA所抽象出来的对象-&-类以及汇集的分析文档,OOD需要有一个根据设计要求整理和求精的过程,使之更能符合OOP的需要。这个整理和求精过程主要有两个方面:一是要根据面向对象的概念模型整理分析所确定的对象结构、属性、方法等内容,改正错误的内容,删去不必要和重复的内容等。二是进行分类整理,以便于下一步数据库设计和程序处理模块设计的需要。整理的方法主要是进行归类,对类、对象、属性、方法和结构、主题进行归类。
数据模型的设计需要确定类或对象属性的内容、消息连接的方式、系统访问、数据模型的方法等。最后每个对象实例的数据都必须落实到面向对象的库结构模型中。
每个对象都有自己的属性和状态,我们需要把这个对象的属性和状态保存在数据库中,那么最理想最简单的情况,就是一个对象对应一张物理表,而对象之间的关联关系(一对一,一对多,多对多)也可以简单映射成数据库的主一外键关系。但还有很多非数据库关系需要考虑,如:继承、聚合、依赖等。一张表如何继承自另一张表呢?关系数据库显然没有这样的定义,这就需要用OR—mapping来完成这种语义的转换。例如,当实例化一个子对象时,OR—mapping负责从代表了“父”对象的表中读出父对象属性并将其赋值给子对象,并且当父对象变化时,OR—mapping需要把这一变化反映到所有子对象实例。
OOD的优化设计过程是从另一个角度对分析结果和处理业务过程的整理归纳,优化包括对象和结构的优化、抽象、集成。
对象和结构的模块化表示OOD提供了一种范式,这种范式支持对类和结构的模块化。这种模块符合一般模块化所要求的且模块之间耦合度弱。集成化使得单个构件有机地结合在一起,相互支持。
在研究OO方法的热潮中,有如下主要研究领域:
(1) 智能计算机的研究。因为OO方法可将知识片看作对象,并为相关知识的模块化提供方便,所以在知识工程领域越来越受到重视。OO方法的设计思想被引入到智能计算机的研究中。
(2) 新一代操作系统的研究。采用OO方法来组织设计新一代操作系统具有如下优点:采用对象来描述OS所需要设计、管理的各类资源信息,如文件、打印机、处理机、各类解设等更为自然;引入OO方法来处理OO的诸多事务,如命名、同步、保护、管理等,会更易实现、更便于维护;OO方法对于多机、并发控制可提供有力的支持,并能得当地管理网络,使其更丰富和协调。
(3) 多学科的综合研究。当前,人工智能、数据库、编程语言的研究有汇合趋势。例如,在研究新一代数据库系统(智能数据库系统)中,能否用人工智能思想与OO方法建立描述功能更强的数椐模型?能否将数据库语言和编程语言融为一体?为了实现多学科的综合,OO方法是一个很有希望的汇聚点。
(4) 新一代面向对象的硬件系统的研究。要支持采用OO方法设计的软件系统的运行,必须建立更理想的能支持OO方法的硬件环境。目前采用松耦合(分布主存)结构的多处理机系统更接近于OO方法的思想;作为最新出现的神经网络计算机的体系结构与OO方法的体系结构具有惊人的类似,并能相互支持与配合:一个神经元就是一个小粒度的对象;神经元的连接机制与OO方法的消息传送有着天然的联系;一次连接可以看作一次消息的发送。可以预料,将OO方法与神经网络研究相互结合,必然可以开发出功能更强、更迷人的新一代计算机硬件系统。