谈到面向对象,这方面的文章非常多。但是,明确地给出对象的定义或说明对象的定义的非常少——至少我现在还没有发现。其初,“面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。许多有关面向对象的文章都只是讲述在面向对象的开发中所需要注意的问题或所采用的比较好的设计方法。看这些文章只有真正懂得什么是对象,什么是面向对象,才能最大程度地对自己有所裨益。这一点,恐怕对初学者甚至是从事相关工作多年的人员也会对它们的概念模糊不清。
面向对象是当前计算机界关心的重点,它是90年代软件开发方法的主流。面向对象的概念和应用已超越了程序设计和软件开发,扩展到很宽的范围。如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
不论采用哪种方法来开发软件,分析的过程都是提取系统需求的过程。分析工作主要包括3项内容,这就是理解,表达和验证。首先,系统分析员通过用户及领域专家的充分交流,力求完全理解用户需求和该应用邻域中的关键性的背景知识,并用某种无二义性的方式把这种理解表达成文档资料。分析过程得出的最重要的文档资料是软件需求规格说明(在面向对象分析中,主要由对象模型,动态模型和功能模型组成)。
由于问题复杂,而且人与人之间的交流带有随意性和非形式化的特点,上述理解过程通常不能一次就达到理解的效果。因此,还必须进一步验证软件需求规格说明的正确性,完整性和有效性,如果发现了问题则进行修正。显然,需求分析过程是系统分析员与用户及领域专家反复交流和多次修正的过程。也就是说,理解和验证的过程通常交替进行,反复迭代,而且往往需要利用原型系统作为辅助工具。
面向对象分析(OOA)的关键是识别出问题域内的类与对象,并分析它们相互间的关系,最终建立起问题域的简洁,精确,可理解的正确模型。在用面向对象观点建立起的3种模型中,对象模型是最基本,最重要,最核心的。
下面我们来看看面向对象的开发方法。
一 .首相让我们来了解什么是面向对象:
(1)对象:对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
(2)对象的状态和行为。
对象具有状态,一个对象用数据值来描述它的状态。
对象还有 *** 作,用于改变对象的状态,对象及其 *** 作就是对象的行为。
对象实现了数据和 *** 作的结合,使数据和 *** 作封装于对象的统一体中
(3)类:具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。
类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
类具有 *** 作,它是对象的行为的抽象,用 *** 作名和实现该 *** 作的方法来描述。
(4)类的结构:在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
①一般——具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
②整体——部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
(5)消息和方法:对象之间进行通信的结构叫做消息。在对象的 *** 作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种 *** 作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
二. 下面让我们来认识一下面向对象的特征和几大要素:
(1)对象唯一性。(2)分类性。(3)继承性。(4)多态性(多形性)
面向对象的要素:(1)抽象。 (2)封装性(信息隐藏)。(3)共享性
三. 面向对象和基于对象的区别:
很多人没有区分“面向对象”和“基于对象”两个不同的概念。面向对象的三大特点(封装,继承,多态)却一不可。通常“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。现在的很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象” 都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些,的确很饶口。
从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”。使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,然而我们的思维并没有真正的转过来,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。
面向对象是一种思想,是我们考虑事情的方法,通常表现为我们是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,而不是考虑将要解决问题抽象为对象去解决它。有些人打着面向对象的幌子,干着过程编程的勾当。
在对面向对象方法学有了一定的理解后,我们可以知道,面向对象方法学的出发点和根本原则,是尽量可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解决的解空间(也称为求解域)在结构上尽可能一致。
四 .面向对象方法学和传统方法学较之有了很大的优点:
1.它与人习惯的思维方法一致。
传统的程序设计技术是面向过程的设计方法,这种方法以计算为中心,把数据和过程作为相互独立的部分,数据代表问题空间中的客体,程序代码则用于处理这些数据。而面向对象的方法学是以对象为核心,用这种技术开发出的软件系统由对象组成的。
2.稳定性好。
传统的软件开发方法以计算法为核心,开发过程基于功能分析和功能分解,所以它很不稳定。而面向对象的方法学是基于构造问题邻域的对象模型,以对象为中心构造软件系统,它的基本做法是对象模拟问题邻域中的实体,以对象间的联系刻画实体间的联系。由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也是比较稳定的。
3.可重用性好。
传统的软件重用技术是利用标准函数库,也就是试图用标准函数库中的函数作为“预制件”来建造新的软件系统,但是,标准函数缺乏必要的“柔性”,不能适应不同应用场合的不同需要,并不时理想的可重用的软件成分。而在实际开发一个新的软件系统时,通常多数函数是开发者自己编写的,甚至绝大多数的函数都是新编的。
面向对象的软件技术在利用可用的软件成分构造新的软件系统时,有很大的灵活性。它有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它,另一种方法是从它派生出一个满足当前需要的新类。它所实现的重用性是自然的和准确的,不像传统的方法是刻意的。
4.较易开发大型软件产品。
在开发大型软件产品时,组织开发人员的方法不恰当往往是出现问题的主要原因。用面向对象方法学时,构成软件系统的每一个对象就像一个微型程序,有自己的数据, *** 作,功能和用途,因此,可以把一个大型软件产品分解成一系列本质上相互独立的向产品来处理,故它比较容易开发大型软件。
5.可维护性好。
用传统的方法和面向过程语言开发出来的软件很难维护,然而面向对象的方法由于存在下面几种原因故维护性好。
因素:面向对象的软件稳定性比较好。
面向对象的软件比较容易修改。
面向对象的软件比较容易理解。
面向对象的软件易于测试和调试。
最后:
目前,面向对象开发方法的研究已日趋成熟,国际上已,有不少面向对象产品出现。我相信这种方法在不断地完善下不仅现在适用,就算再将来,它也会被相当多的开发商使用的。
使用MVC进行项目开发已经有一段时间了,在这段时间里感触最深的就是自己对宏观性面向对象分析方法的缺乏。面向对象分析是当今流行的系统分析方法之一,下面就谈谈在做项目的过程中我的一些小经验。在面对简单系统时程序员可以很顺利的提出问题的解决方案,并且一般情况下都是可行的。这是由于问题域关系简单,所涉及到的内部构造、联系比较容易解释。而对于当前越来越复杂的系统,其问题域也就显示的越来越复杂,而且内部的关系也不是很容易解释,有些大的系统常常超出了人的解决问题的能力。在这种情况下,以往的面对过程的解决方法已经不能满足日益增长的复杂系统分析的需要,在这种情况下,面向对象的分析方法就显得尤为总要了。
在面向对象设计领域中,在横向上把问题域分为数个不同的、低耦合、高内聚的问题域,而在纵向上又继续分解各个不同的小的问题域,最后分解为叶节点问题域,从而解决问题。在面对对象分析方法中,用数个对象间的消息传递来完成整个问题。
下面看一看复杂系统的5个属性:
1. 杂性经常是以层次的形式表现出来,复杂系统是由相互关联的子系统组成,而这些子系统又是由他们各自的子系统构成,并由此类推到最底层的基本构件。
2. 对系统中最基本的构件的选择是任意的,而且在很大程度上取决于系统观察者的判断力。
3. 一般而言,各构件内的连接总是要强于构件间的连接。在从构件的低频动态中分离出高频动态时,这一属性是相当有用的。这是因为高频动态涉及到各部件的内部结构,而低频动态涉及到构件间的交互。
4. 层次系统通常都是由仅仅少数不同的子系统通过不同的排列组合方式组成。
5. 我们发现正运行的复杂系统总是由以前运行的简单系统演化而来……任何胡乱凑合设计出来的复杂系统都不可能正常运转,也不可能被修补好。我们必须由运行中的简单系统开始。
对于第一点,正像我上面所说的那样,系统是层次结构的。能够给一个复杂的系统进行正确的层次分析,才能够保证对系统的正确估计,包括可行性、可维护性、可扩展性……等等。而且对于日后对该系统进行维护(maintenance)、演化(evolution)、维持(preservation)都能够很好的支持。
对于其中的第二点,强调了观察者的判断力,其实我认为其中也包括观察者的身份角度。对于一个系统而言,观察者并不是只进行分析设计的工程师,编码阶段的程序员,还应该包括用户等所有这些同该系统有关的人员。作为不同的人员,对于系统就有不同的观察点、观察角度、身份等特殊因素。因此在不同身份的人(指参与者)甚至同一身份的人眼中说观察到的系统特性都是不尽相同的。在大学里大家都接触过透明性的概念,这就是不同观察者所观察角度不同的直观反应。对于用户来说,基本上底层的 *** 作、算法、通讯对于他们来说都是透明的,他们根本不用理会(其实也不知道)内部用了什么。而对于一个负责某模块的程序员来说就不会考虑其他模块的实现,对于他们来说其他模块是透明的,他们只需要负责管理好提供的模块接口就OK了。
对于第三点,讲的就是面对对象分析设计的方向,在面对对象分析设计系统时,被分解的各个模块一定要做到高内聚、低耦合。有良好高内聚、低耦合系统常常会很容易维护,一个地方改动通常不需要牵扯到大的改动,维护行强。而且对于像VC程序这种更要求效率的程序来说,高内聚、低耦合也可以提高程序的运行期效率,应为对象内部的调用一般情况下会相比模块间的调用占用更少的执行时间,这样将高频动态封装在一个对象内部就会一定程度上提高程序运行期执行效率。
第四点则说明了面向对象程序设计对程序设计可复用性的优点。在这点中所“层次系统由仅仅少数不同的子系统构成”那么多数子系统在不同的复杂系统中都是能够重复使用的。比如说建筑一栋大厦和建筑桥梁,虽然两者都是复杂的系统,但是对于其结构中就会有很多相似甚至相同之处,没有必要建筑好大厦回头建筑桥梁的时候又要重新设计每一快砖瓦。
第五点提醒我们在系统设计时,尽量使用以往能够正常运行的子系统来重新构件新的系统。这一点不仅说明第四点中的复用性,而且也说明了一个我们常常要犯的错误。就是将并没有通过严格测试的子系统,匆忙的加入到大系统中,这样做不利于对系统的基层,常常引入了其他错误,使得系统频频崩溃,最严重会导致系统的重新分析。
这是我对面向对象的一点心得体会,虽然我们大家在平时工作中所面对的问题、问题域不同,使用的开发工具不同,但是面向对象是一种思维方式,有利于分析、解决问题的一种方法,并不和任何语言挂钩(当然语言对于面向对象特性的支持程度有所不同)。所以希望各位同事能够尽量使用科学的方法分析解决问题,形成一种设计模式,以供大家互相交流。
软件设计是一种艺术,也是一门工程学。
面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。面向对象方法作为一种新型的独具优越性的新方法正引起全世界越来越广泛的关注和高度的重视,它被誉为"研究高技术的好方法",更是当前计算机界关心的重点。十多年来,在对OO方法如火如荼的研究热潮中,许多专家和学者预言:正象70年代结构化方法对计算机技术应用所产生的巨大影响和促进那样,90年代OO方法会强烈地影响、推动和促进一系列高技术的发展和多学科的综合。 它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其它概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。 它可以有不同层次的理解: 从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。 从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。 从程序设计的角度来看,面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其 *** 作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)