面对对象的思考(二)

原创 2002年08月08日 11:04:00

面对对象的思考(二)

    如今,面对对象方法几乎成为了成功、先进、效率的代名词。使用面对对象的方法设计和实现一个软件几乎成为了开发者们的默认选择。但是,这种方法是否已经真正取得了成功了呢?真的达到了在他产生时候宣称的优势呢?很显然对于这样的问题大多数人是迷惑,不能作出肯定的回答。面对对象的方法在软件分析和设计方面仍然遇到了困难,这些困难主要有这些表现:
     1、抽象现实问题的方法不容易被开发者真正掌握。分解问题域中对象一般的思考方式有以下两种,一种是抽象对象的性质,这种方法实际上就是对象继承,第二种就是对象组合的方法。在经典的理论中认为对象的继承是面对对象方法的实质,但是不符合大多数人的思维习惯。对于一个轮胎而言,人们更愿把它看成轮箍、外胎、内胎等等结构的组合体,而不是抽象成这样的层次关系,橡胶-〉含有金属的橡胶-含有金属的圆形橡胶-〉轮胎。
     2、分析到设计仍然不能平滑的过渡,在分析阶段产生对象,往往有很多现实的名词,这影响了设计者的思考,使他们不能关注对象在问题域中的关系,往往受到这些名词其他含义影响。假定普通的企业管理系统中,分析作了人-〉公司职员-〉高级职员-〉经理的抽象,设计人员往往会被人、经理、高级职员这些名词的影响,不能把这样的现实对象很好的映射到程序结构中去,甚至会去定义人的姓名、年龄这些属性,然而这些属性在问题域中是不关心的,实际上在程序结构中人这个对象会和真正的人概念完全不一样,之所以抽象这些对象实际上为了提取问题域中的静态关系和动态关系,现实的名词干扰了设计者。
     3、面对对象方法产生的软件没有完全实现宣称的软件复用和简化维护的目标。在没有完全采用抽象对象性质的方法的时候,实际上完全采用也是很困难的,大多数人习惯于把复杂的事物分解成一组组合的对象,把简单的事物进行抽象,在这种情况下产生的软件结构是复杂的,对象组合之间必然充满了复杂的消息,要进行重复使用和维护当然是不容易的。
    4、缺乏评价一个面对对象设计的标准,一个设计,或者说怎样做出一个能够实现软件复用、降低软件复杂性的设计,没有很好的理论支持。这本身就是由于对象抽象的灵活性造成的,不同的人对同样的问题完全会有不同的抽象方法,面对对象的方法不限制人们抽象的方法,或者说根本没有一套抽象的方法。我说的是抽象,和对象组合对应。缺乏标准,也必然造成软件复用困难。
     为了解决这些问题,很多人进行了回归,我要说一些大逆不道的话了。第一个概念把继承分解为接口继承和实现继承,认为对象实际上是实现和宣称的方法集组成的,在现实的设计活动中,他们找到了复用的好办法,因为他们把接口和实现分离,这样在通过同样的接口就可以操纵不同的对象,而不用关心背后对象的细节,这样降低了对象之间的关联程度。第二个概念,尽量使用对象组合而不是继承,在把继承分解以后,就会很自然的发现,纯虚的基类实际上成为了对象的接口,而且为了复用的方便,几乎完全不要实现继承,因为复用是对象本身,而不是用它的基类,所以定义一个良好的组合成为了关键,而且继承也会为这种复用带来麻烦。我把这种解决方法称为回归,这是面对对象向结构化的回归,或者说结构化方法的延伸。在对象进行复用的时候,一般不使用已经成型的对象,而是使用基类,复用的是基类已经实现的方法,当然这样做,需要深刻理解原作者的意图。一个只有一个纯虚基类的对象和一个模块有什么差别呢?这是模块的复用。复用的只是接口,也就是一组定义,要实现支持同样接口的不同对象,需要完全重新设计,实际上并没有代码复用。他把实现的复杂性推给了后面的设计者。如果仅仅把接口复用当成分析,在实现这个借口对象的时候仍然坚持实现继承,也就是实现的时候仍然分层,那么这当然是可取的,但是我看不出需要接口继承的意义。在这种方法下,设计者更倾向于进行问题的功能分解,举个例子,设计企业的管理系统,设计者很可能在这种思考方式的主导下,划分成财务部,人事部,业务部。这完全背离了面对对象方法的初衷。
    大多数问题是复杂的,习惯总是明智的,把一个大的问题分解成小问题,在解决小问题的时候使用抽象的方法,可以说是一个很好的折衷,也是很有效率的。但是不能把整个问题都细化,或者说完全取消实现继承,如果那样我看不出这还是面对对象。我更愿意看到结构化方法和面对对象方法的融合,而不是盗用了面对对象的概念行结构化的做法。在对于评价分层抽象,或者说分层抽象指导原则、模式,几乎没有,这不能说是完整的。就像气宗和剑宗构成了华山派一样,独孤九剑好像是绝种的剑宗武功,虽然难炼,但是杀了岳不群。

面对对象和面对过程的理解

1、面向过程 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,程序从main()函数起运行,调用一个个其它函数。  也就是说,面向过程是由函数堆积...
  • qq_30716173
  • qq_30716173
  • 2015年10月17日 10:50
  • 921

面对对象的思考

面对对象的思考 在比较老一些的讨论面对对象方法的书籍中,都把继承看成了最为关键的部分。一般认为,面对对象的方法中最为核心的部分就是继承,因为从继承的角度思考问题,是和结构化设计最为明显的区别。如果,对...
  • BlueTrees
  • BlueTrees
  • 2002年08月05日 09:33
  • 2054

JAVA初学:关于“面对对象”的一些理解与感悟

如何理解JAVA面对对象的思想
  • Deadline_1
  • Deadline_1
  • 2016年05月18日 16:01
  • 976

面对过程和面对象的最大区别与比较(初学者)

记得刚开始学习面对对象语言(JAVA),感觉不到面向对象与面向过程有什么区别和什么好处,只觉得书本上的对面对对象声称的好处:封装,继承,多态都很模糊。相信很多初学的都会有和我一样的感觉吧。 面对对象的...
  • xiaol_zhong
  • xiaol_zhong
  • 2010年03月14日 16:14
  • 5325

js面对对象编程

说到js,很大一部分人会说我很熟悉,在日常的web开发中经常用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,减少了混乱,可维...
  • xqf309
  • xqf309
  • 2014年06月29日 21:15
  • 2215

面对对象的语言的三大特征

1:封装          封装是 JAVA 面向对象的特点的表现,封装是一种信息隐蔽技术。 它有两个含义:即把对象的全部属性和全部服务结合在一起, 形成一个不可分割的独立单位; 以及尽可能隐藏对象...
  • tfygg
  • tfygg
  • 2014年02月21日 15:45
  • 1774

面对对象三大特性—封装

定义:封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。将引用类型数据或基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据...
  • LuRenJia11083
  • LuRenJia11083
  • 2017年06月09日 15:25
  • 162

超级容易理解!!!Java的面向对象思想———类与对象。

在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。 首先我们来简单的阐述面向对象的思想。 面向对象: 官方的语言很抽象,我们把官方的...
  • a907691592
  • a907691592
  • 2016年06月07日 16:17
  • 14514

JAVA面对对象

141.     局部变量、成员变量、静态变量分别怎么声明? 
 局部变量和成员变量的作用域有局限性,一般都要看花括号来进行判断。而全局变量一般作用于整个类。静态变量的声明是 static 142...
  • jolivan
  • jolivan
  • 2017年05月01日 15:25
  • 449

python学习(3):python中的面向对象思想,类和对象

Python中的类和对象和java中的类和对象用法大部分是一样的,只是语法的差别 闲话少说,下面的代码是类的定义,类中成员和方法的定义,以及继承的使用 ''' 类的使用 ''' cla...
  • qq_32166627
  • qq_32166627
  • 2017年03月02日 21:50
  • 360
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面对对象的思考(二)
举报原因:
原因补充:

(最多只允许输入30个字)