面向对象

面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术 发展到一定阶段后的产物。

 



概念


⑴对象。


对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。


⑵对象的状态和行为。


对象具有状态,一个对象用数据值来描述它的状态。


对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。


对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中


⑶类。


具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。


类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。


类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。


⑷类的结构。


在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。


①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。


②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。


⑸消息和方法。


对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。


类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。


 




特征


⑴对象唯一性。


每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。


⑵抽象性。


抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。


⑶继承性。


继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。


继承性是面向对象程序设计语言不同于其它语言的最重要的特点,是其他语言所没有的。


在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。


在类层次中,子类继承了多个父类的数据结构和方法,则称为多重继承。


多重继承,JAVA、VB、NET、Objective-C均仅支持单继承,注意在C++多重继承时,需小心二义性。


在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。


采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。


⑷多态性(多形性)


多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。


多态性允许每个对象以适合自身的方式去响应共同的消息。


多态性增强了软件的灵活性和重用性。


 




设计


面向对象设计是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。从面向对象分析到面向对象设计,是一个逐渐扩充模型的过程。


瀑布模型把设计进一步划分成概要设计和详细设计两个阶段,类似地,也可以把面向对象设计再细分为系统设计和对象设计。系统设计确定实现系统的策略和目标系统的高层结构。对象设计确定解空间中的类、关联、接口形式及实现操作的算法。


(一)面向对象设计的准则


⒈模块化


面向对象开发方法很自然地支持了把系统分解成模块的设计原则:对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。分解系统为一组具有高内聚和松耦合的模块是模块化的属性。


⒉抽象


面向对象方法不仅支持过程抽象,而且支持数据抽象。


⒊信息隐藏


在面向对象方法中,信息隐藏通过对象的封装性来实现。


⒋低耦合


在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。


⒌高内聚


⑴操作内聚。


⑵类内聚。


⑶一般——具体内聚。


(二)面向对象设计的启发规则


⒈设计结果应该清晰易懂


使设计结果清晰、易懂、易读是提高软件可维护性和可重用性的重要措施。显然,人们不会重用那些他们不理解的设计。


要做到:


⑴用词一致。


⑵使用已有的协议。


⑶减少消息模式的数量。


⑷避免模糊的定义。


⒉一般——具体结构的深度应适当


⒊设计简单类


应该尽量设计小而简单的类,这样便以开发和管理。为了保持简单,应注意以下几点:


⑴避免包含过多的属性。


⑵有明确的定义。


⑶尽量简化对象之间的合作关系。


⑷不要提供太多的操作。 


⒋使用简单的协议


一般来说,消息中参数不要超过3个。


⒌使用简单的操作


面向对象设计出来的类中的操作通常都很小,一般只有3至5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能


⒍把设计变动减至最小


通常,设计的质量越高,设计结果保持不变的时间也越长。即使出现必须修改设计的情况,也应该使修改的范围尽可能小。


(三)系统设计


系统设计是问题求解及建立解答的高级策略。必须制定解决问题的基该方法,系统的高层结构形式包括子系统的分解、它的固有并发性、子系统分配给硬软件、数据存储管理、资源协调、软件控制实现、人机交互接口。


⒈系统设计概述


设计阶段先从高层入手,然后细化。系统设计要决定整个结构及风格,这种结构为后面设计阶段的更详细策略的设计提供了基础。


⑴系统分解。


系统中主要的组成部分称为子系统,子系统既不是一个对象也不是一个功能,而是类、关联、操作、事件和约束的集合。


⑵确定并发性。


分析模型、现实世界及硬件中不少对象均是并发的。


⑶处理器及任务分配。


各并发子系统必须分配给单个硬件单元,要么是一个一般的处理器,要么是一个具体的功能单元。


⑷数据存储管理。


系统中的内部数据和外部数据的存储管理是一项重要的任务。通常各数据存储可以将数据结构、文件、数据库组合在一起,不同数据存储要在费用、访问时间、容量及可靠性之间做出折衷考虑。[2] 


⑸全局资源的处理。


必须确定全局资源,并且制定访问全局资源的策略。


⑹选择软件控制机制。


分析模型中所有交互行为都表示为对象之间的事件。系统设计必须从多种方法中选择某种方法来实现软件的控制。


⑺人机交互接口设计。


设计中的大部分工作都与稳定的状态行为有关,但必须考虑用户使用系统的交互接口。


⒉系统结构的一般框架


⒊系统分解——建立系统的体系结构


可用的软件库以及程序员的编程经验。


通过面向对象分析得到的问题域精确模型,为设计体系结构奠定了良好的基础,建立了完整的框架。


⒋选择软件控制机制


软件系统中存在两种控制流,外部控制流和内部控制流。


⒌数据存储管理


数据存储管理是系统存储或检索对象的基本设施,它建立在某种数据存储管理系统之上,并且隔离了数据存储管理模式的影响。


⒍设计人机交互接口


在面向对象分析过程中,已经对用户界面需求作了初步分析,在面向对象设计过程中,则应该对系统的人机交互接口进行详细设计,以确定人机交互的细节,其中包括指定窗口和报表的形式、设计命令层次等项内容。


(四)对象设计


⒈对象设计概述


⒉三种模型的结合


⑴获得操作。


⑵确定操作的目标对象。


⒊算法设计


⒋优化设计


⒌控制的实现


⒍调整继承


⒎关联的设计


 



面向对象程序设计


面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。


已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。


当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。