什么是面向对象的设计思想?

什么是面向对象的设计思想?


  什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方,

  特别是这个处于新旧思想交替的时代,许多人刚刚学完现在看来是快要淘汰的只是面向过程的

  语言。他们的脑子还没有脱离面向过程思想的束缚,抬头却发现,“面向对象”早已经流行

  开来,这个陌生的词漫天飞舞。随便拿起一本流行计算机技术书籍,那里会没有“面向对象”

  的字眼!于是心中便惶惑了:什么叫“面向对象”?不感兴趣者,一带而过;有志于在这方

  面发展的,匆忙找到一本有关书籍来啃究竟什么是“面向对象”。然而,要突破思想的束缚,

  说难也不难,说到要深刻认识却也不容易。笔者在做了一些轻量级的工作后,颇以为有点心

  得,不怕贻笑大方,写出已供广大同行批评指正。

  “对象(Object)”一词,早在十九世纪就有现象学大师胡塞尔提出并定义。对象是世

  界中的物体在人脑中的映象,是人的意识之所以为意识的反映,是做为一种概念而存在的

  先念的东西,它还包括了人的意愿。举例说明吧。当我们认识到一种新的物体,它叫树,于

  是在我们的意识当中就形成了树的概念。这个概念会一直存在于我们的思维当中,并不会因

  为这棵树被砍掉而消失。这个概念就是现实世界当中的物体在我们意识当中的映象。我们对

  它还可以有我们自己的意愿,虽然我们并不需要付诸实现――只要在你的脑中想着把这棵树

  砍掉做成桌子、凳子等――我们就把它叫做意向。于是,对象就是客观世界中物体在人脑中

  的映象及人的意向。只要这个对象存在我们的思维意识当中,我们就可以籍此判断同类的东

  西。譬如,当我们看到另外一棵树是,并不会因为所见的第一棵树不在了失去了供参照的模

  板而不认识这棵树了。当我们接触某些新事物时,我们的意识就会为这些事物确立一个对象

  。当然这个过程是怎么形成的,那就不是我们所能讨论的问题了。

  上面所说的对象研究的是一般意义上的问题,因而它可以外推到一切事物。我们经常

  所说的“对象”,一班指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来解

  决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对

  象的分析(Object-Oriented Analysis)、面向对象的设计(Object-Oriented Design)等。应用

  前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我

  们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个

  对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可

  以由一个对象来表示。这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员

  的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元

  组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的

  范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向

  本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图

  等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,

  它也只需要做“自己”的事情,因为有元?槎韵蟮闹С郑扌肴タ悸窍裨厥欠窈戏ㄕ饫?

  的事情。甚至,有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法。

  这样,更能显示面向对象的优势。

  上面所讨论的可以说是面向对象的分析方法。在具体的设计过程当中,还应该采用适当

  的方式。因为面向对象的思想固然很先进,如果做得不好的话,同样不能达到预期的效果。

  这主要表现在处理对象与对象的关系上没有做好,对象与对象的层次不分明。如上面所举得

  关系型数据库得例子,如果在元组层面上得对象过多得考虑一个表对象得因素,或一个表层

  面上对象过多地考虑一个元组对象的因素,甚至去考虑元素层面上的因素,这些都不是好的

  面向对象的设计方法。这一点,在语言实现方面,Java比C++更有优势,因为它不允许多

  重继承,从而使对象之间的关系更明确。谁也不会否认C++的功能更强大,但是它也要由次

  付出巨大代价――当现在代码库发展到一定程度、一定规模时,个对象之间的层次关系将

  变得异常复杂,给后继使用者得学习、理解带来很大的困难,应用上很难把握。另外,虽然

  C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C++完全可以不用

  面向对象的思想来进行程序设计,当然人们不会这样去做――除了那些只是把C++看成是C

  扩充的初学者,这就为以后的发展埋下了隐患。在者一方面,Java的限制更多一点。就者一

  点还远远不够。搞开发的是人,开发方法是由人决定的。要应用面向对象的方法开发出优秀

  的软件,必须要求开发人员具有良好的面向对象的思想。好的工程师可以利用适当的工具开

  发出优秀的软件――而不在乎他所使用的语言工具――Java、C++、Object Pascal、Ada等。

  要能应用面向对象的思想熟练得做好系统分析、设计、实现(编程),首先要求开发人

  员知道什么是对象,什么是面向对象得概念,否则是谈不上应用面向对象得思想搞软件开发

  了。希望读者能在看到我在前面的不太严密、详细的论述之后可以对“对象”这个概念由一

  个初步的了解,同时也希望有不同看法的同行提出批评。其次,还要求开发人员有比较丰富的开

  发经验。否则,光谈理论,那是不能真正体会“面向对象”的含义的。尽管如此,我们还是

  可以定出一般的规则的。抛开生命周期的其它阶段,对一个确立的系统一般可以进行以下几

  个过程:

  一、首先应用面向对象的思想进行系统分析。仔细的划分系统的各个部分,明确它

  们之间的层次关系,然后将各个部分作为一个对象进行功能上的分析。例如,要设计一个用

  户界面,它可能由几个主要的窗体组成:主窗体MainFrame、功能性子窗体FunctionFrame

  以及对话对话框Dialog。其中,MainFrame中可能还包括菜单、工具条、文本框、状态条等

  Windows组件。对于要完成一些重要功能的组件,我们可以单独将它作为一个对象看待,在

  具体的实现中,用单独一个类来表示。而一些并不是很重要的、只是在过程中需要用到的组

  件,就可以将它们集成到其他对象中去。要明确每个对象自己的任务――不要让它有缺陷,

  也不能越殂代庖。各个对象之间的关系通过过程、内容、功能等耦合来实现。

  实际上,如果你是用Java进行开发,你会发现swing组件本身就非常好用,因为它们

  之间的关系是很分明的――你无须去理解分清象C++中的组件那样复杂的关系。在开发你自

  己的组件时,也需要力求达到这样的效果。

  二、其次时应用面向对象的思想进行系统设计。其实在真正做好了系统分析的工作之后,

  进行设计就比较轻松了。这段时间只要进一步确定各个对象的功能以及各个对象之间的关系

  。为了能够更好地帮助实现人员明白各个对象之间的关系,可以利用一些工具将这些组件的

  关系表示出来,统一建模语言(Uniformed Module Language,UML)就是这样的一种好东

  西。它不仅可以现在帮助开发人员了解整个系统,也为以后的维护工作提供一个档案文件,

  给以后的工作提供巨大的方便。

  

  在搞软件开发时,编码不是最重要的。分析、设计才是最重要的。也许当我们接受了一

  些更先进的思想之后,会更加理解这一点了。希望我们中国的软件开发人员能应用面向对象

  的思想开发出具有国际竞争力的优秀软件。


理解Java面向对象的程序设计思想


  所有计算机均由两种元素组成:代码和数据.精确的说,有些程序是围绕着"什么正在发生"而编写,有些则是围绕"谁正在受影响"而编写的。

  第一种编程方式叫做"面向过程的模型",按这种模型编写的程序以一系列的线性步骤(代码)为特征,可被理解为作用于数据的代码.如 C 等过程化语言。

  第二种编程方式叫做"面向对象的模型",按这种模型编写的程序围绕着程序的数据(对象)和针对该对象而严格定义的接口来组织程序,
它的特点是数据控制代码的访问通过把控制权转移到数据上,面向对象的模型在组织方式上有:抽象,封装,继承和多态的好处.

  抽象

  面向对象程序设计的基本要素是抽象,程序员通过抽象来管理复杂性。

  管理抽象的有效方法是使用层次式的分类特性,这种方法允许用户根据物理含义分解一个复杂的系统,把它划分成更容易管理的块.例如,
一个计算机系统是一个独立的对象.而在计算机系统内部由几个子系统组成:显示器,键盘,硬盘驱动器,DVD-ROM,软盘,音响等,
这些子系统每个又由专门的部件组成.关键是需要使用层次抽象来管理计算机系统(或其他任何复杂系统)的复杂性。

  面向对象程序设计的本质:这些抽象的对象可以被看作具体的实体,这些实体对用来告诉我们作什么的消息进行响应。

/* (我的理解)
*计算机是一个实体,我要输入字符,显示器显示出来,那么
*计算机(对象).输入(键盘属性).显示(显示方法)
*使用分层来引用,操作.而不用管计算机内部如何处理.
*只要有计算机对象,它就能响应我的操作,而我敲键盘,
*计算机对象就把这个消息传给屏幕,屏幕显示.
*/

  计算机对象包含了它所有的属性,以及操作,这就是面向对象程序设计的三大原则之一:封装.

  封装

  封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制.封装可被理解为一种用做保护的包装器,
以防止代码和数据被包装器外部所定义的其他代码任意访问.对包装器内部代码与数据的访问通过一个明确定义的接口来控制.
封装代码的好处是每个人都知道怎样访问代码,进而无需考虑实现细节就能直接使用它,同时不用担心不可预料的副作用。

  在JAVA中,最基本的封装单元是类,一个类定义着将由一组对象所共享的行为(数据和代码).一个类的每个对象均包含它所定义的结构与行为,
这些对象就好象是一个模子铸造出来的.所以对象也叫做类的实例。

  在定义一个类时,需要指定构成该类的代码与数据.特别是,类所定义的对象叫做成员变量或实例变量.操作数据的代码叫做成员方法.
方法定义怎样使用成员变量,这意味着类的行为和接口要由操作实例数据的方法来定义。

  由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制.所以JAVA中提供了私有和公有的访问模式,
类的公有接口代表外部的用户应该知道或可以知道的每件东西.私有的方法数据只能通过该类的成员代码来访问.这就可以确保不会发生不希望的事情。

  继承

  继承是指一个对象从另一个对象中获得属性的过程.是面向对象程序设计的三大原则之二,它支持按层次分类的概念.例如,
波斯猫是猫的一种,猫又是哺乳动物的一种,哺乳动物又是动物的一种.如果不使用层次的概念,
每个对象需要明确定义各自的全部特征.通过层次分类方式,一个对象只需要在它的类中定义是它成为唯一的 各个属性,
然后从父类中继承它的通用属性.因此,正是由于继承机制,才使得一个对象可以成为一个通用类的一个特定实例.
一个深度继承的子类将继承它在类层次中的每个祖先的所有属性。

  继承与封装可以互相作用.如果一个给定的类封装了某些属性,它的任何子类将会含有同样得属性,另加各个子类所有得属性.
这是面向对象程序在复杂性上呈线性而非几何增长的一个重要概念.新的子类继承其所有祖先的所有属性.子类和系统中的其他代码不会产生无法预料的交互作用。

  多态

  多态是指一个方法只能有一个名称,但可以有许多形态,也就是程序中可以定义多个同名的方法,用"一个接口,多个方法"来描述.可以通过方法的参数和类型引用。

  封装,继承,多态的组合使用

  在由封装,继承,多态所组成的环境中,程序员可以编写出比面向过程模型更健壮,更具扩展性的程序.经过仔细设计的类层次结构是重用代码的基础.
封装能让程序员不必修改公有接口的代码即可实现程序的移植.多态能使程序员开发出简洁,易懂,易修改的代码.例如:汽车
从继承的角度看,驾驶员都依靠继承性来驾驶不同类型(子类)的汽车,无论这辆车是轿车还是卡车,是奔驰牌还是菲亚特牌,
驾驶员都能找到方向盘,手刹,换档器.经过一段时间驾驶后,都能知道手动档与自动档之间的差别,因为他们实际上都知道这两者的共同超类:传动装置.
从封装的角度看,驾驶员总是看到封装好的特性.刹车隐藏了许多复杂性,其外观如此简单,用脚就能操作它.发动机,手刹,轮胎大小的实现对与刹车类的定义没有影响。

  从多态的角度看,刹车系统有正锁反锁之分,驾驶员只用脚踩刹车停车,同样的接口可以用来控制若干种不同的实现(正锁或反锁).
这样各个独立的构件才被转换为汽车这个对象的.同样,通过使用面向对象的设计原则,程序员可以把一个复杂程序的各个构件组合在一起,形成一个一致,
健壮,可维护的程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值