面向对象技术浅析

面向对象技术浅析,第1张

众说纷纭

在上世纪末到本世纪初期,是OOP(Object-Oriented Programming)发展的顶峰,那个时期的人们对面向对象非常痴迷,“一切皆对象”的思想逐渐成为一种共识,这种现象对着设计模式的提出,面向对象编程语言C++和Java的快速发展而变得更加炙热。

但是近十几年来,面向对象编程却迎来了巨大的质疑,越来越多的技术专家发文抨击所谓的面向对象,认为面向对象只不过是噱头,对于项目的实际开发并没有多大帮助,甚至是造成软件复杂混乱的根源(详见Why OO Sucks by Joe Armstrong等文章)。这种对面向对象剧烈的抨击一方面是来自近些年兴起的函数式编程的拥护者,另一方面来自开发一线需要直面面向对象系统的开发人员。

中文互联网上对于面向对象的批评大都比较温和理性,大家讨论更多的是面向对象的弊端(详见面向对象编程的弊端是什么?、为什么面向对象糟透了?、如此理解面向对象编程等文章)。

但是如果仔细阅读这些文章就会发现,大家所抨击的并不是面向对象技术本身,而是滥用面向对象技术。我觉得这是一种合理的批评,任何技术都不可能是银d(万金油),可以解决所有的开发问题,现在面向对象回归到一种普通的设计技术才是比较合理的。总体来讲大家还是认为面向对象技术是一种有效的系统设计思想,但是不能滥用。在这里我也想表达一下我自己对面向对象技术态度转变的心路历程。

由于我刚开始接触编程的主要场景都是竞赛,大家都是在把C++当作C with STL在用,在本科C++课堂上我才开始接触到面向对象编程,当时就感受到了封装的魅力(详见我的博客C++小型公司管理系统),但是由于项目太小,没有认识到多态的作用,而后是在学习设计模式和阅读《C++ primer》的过程中才慢慢体会到继承和多态的好处。再后来在阅读《Linux多线程服务端编程》中陈硕一阵见血地指出:继承的耦合性太强,应该尽量使用组合,对于接口的实现应该尽可能地基于函数式编程。

个人浅见

面向对象的三大特征:封装、继承和多态在我看起来应该分成两类,其中继承和多态应该是紧密绑定在一起的:多态是继承的表现形式,继承是多态的实现方法,当然他们都是站在封装的基础上。

  • 单纯使用封装的编程方法叫做基于对象编程,通过将数据和函数绑定在一起使得数据有了自己的行为,并且将对数据的处理细节隐藏起来对上层透明。这是一种很棒的想法,也是一种很自然的想法,面向对象语言只是将其具体地变现了出来,就算用C语言也会很自然地用到这种封装的思路。
  • 另一方面则是继承和多态。我很长时间都不能理解为什么大家对设计模式那么热衷,直到我自己开发了一个稍大一些的系统,并且要对他不断进行改动的时候,我才深刻理解到一个高耦合的系统设计意味着什么(几乎无法修改,修改工作量巨大,还不如重写)。而后我也开始慢慢理解为什么大家讨厌继承,这一切的关键在于变化。如果从静态的角度去看,继承和多态是很棒的设计思路,大家理解起来非常自然(过度设计除外),但是如果面对的是一个剧烈变化的系统(类与类之间的关系都需要经常变动),继承带来的高耦合(继承关系、重写函数名和函数参数都很难改变)的确是开发人员的噩梦。这也是近些年很多人热衷于函数式编程,因为没有这些负担。

综上,我认为应该理性地对待面向对象技术,在实际开发过程中:

  • 尽可能使用组合而不是继承
  • 设计良好的接口对数据进行封装以力求达到高内聚、低耦合(要考虑到日后可能的变化)
  • 依赖于接口而不是实现
  • 对于比较稳定、需要对数据进行封装的接口可以考虑使用继承和多态来隔离变化,对于变化剧烈、没有数据参与的接口可以考虑函数式编程。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2991009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存