在上世纪末到本世纪初期,是OOP(Object-Oriented Programming)发展的顶峰,那个时期的人们对面向对象非常痴迷,“一切皆对象”的思想逐渐成为一种共识,这种现象对着设计模式的提出,面向对象编程语言C++和Java的快速发展而变得更加炙热。
但是近十几年来,面向对象编程却迎来了巨大的质疑,越来越多的技术专家发文抨击所谓的面向对象,认为面向对象只不过是噱头,对于项目的实际开发并没有多大帮助,甚至是造成软件复杂混乱的根源(详见Why OO Sucks by Joe Armstrong等文章)。这种对面向对象剧烈的抨击一方面是来自近些年兴起的函数式编程的拥护者,另一方面来自开发一线需要直面面向对象系统的开发人员。
中文互联网上对于面向对象的批评大都比较温和理性,大家讨论更多的是面向对象的弊端(详见面向对象编程的弊端是什么?、为什么面向对象糟透了?、如此理解面向对象编程等文章)。
但是如果仔细阅读这些文章就会发现,大家所抨击的并不是面向对象技术本身,而是滥用面向对象技术。我觉得这是一种合理的批评,任何技术都不可能是银弹(万金油),可以解决所有的开发问题,现在面向对象回归到一种普通的设计技术才是比较合理的。总体来讲大家还是认为面向对象技术是一种有效的系统设计思想,但是不能滥用。在这里我也想表达一下我自己对面向对象技术态度转变的心路历程。
由于我刚开始接触编程的主要场景都是竞赛,大家都是在把C++当作C with STL在用,在本科C++课堂上我才开始接触到面向对象编程,当时就感受到了封装的魅力(详见我的博客C++小型公司管理系统),但是由于项目太小,没有认识到多态的作用,而后是在学习设计模式和阅读《C++ primer》的过程中才慢慢体会到继承和多态的好处。再后来在阅读《Linux多线程服务端编程》中陈硕一阵见血地指出:继承的耦合性太强,应该尽量使用组合,对于接口的实现应该尽可能地基于函数式编程。
面向对象的三大特征:封装、继承和多态在我看起来应该分成两类,其中继承和多态应该是紧密绑定在一起的:多态是继承的表现形式,继承是多态的实现方法,当然他们都是站在封装的基础上。
综上,我认为应该理性地对待面向对象技术,在实际开发过程中: