面向对象,还是面向对象!



当今世界的软件研发中,面向对象一直是主导的技术,包括OOA(Object Oriented Analysis)、OOD(Object Oriented Design)、OOP(Object Oriented Programming)。从具体的代码实现片段,到设计模式、系统架构,到业务分析,面向对象在软件开发中无处不在。面向对象的思想,是程序员、设计师、架构师、需求分析师的必备的核心技能。
然而,在现实中,深入掌握面向对象的技术人员,少之又少!
面向对象,有何难?为什么很多人学习和项目应用了很多年,还不能彻底掌握它?

究其根源,面向对象是一种思想,而非一种单纯的技术。面向对象,是一种分析问题、思考问题、解决问题的思维方法,其理论高度抽象,实际应用时需要具体问题具体分析、活学活用。一旦不是固定的模式,就像没有了数学公式和物理定律,很多人面对问题时就只会生搬硬套,机械照搬,根本就是死读书,读死书!

面向对象,只包括了三个基本概念:继承、封装和多态。

我常常在面试时询问应试者:这三个概念,你认为哪个最难?绝大多数人都认为,多态最难。

其实,多态是这三个概念中最简单的!因为多态的应用场景非常固定:通过父类的类型,调用虚函数,由子类来提供不同的实现。这种固定的用法,是最容易理解、最容易掌握的。之所以很多人认为多态最难,是因为多态这个词语对刚接触的人来说非常陌生,并且在面向对象、C++教程之类的书籍中,都用了大量的篇幅来介绍多态。相比之下,继承和封装的概念易于理解,一看就明白,因此也不觉得继承和封装有什么高深的。

恰恰是继承和封装这两个概念,一看就懂,可一用就错!

先说继承。所谓继承,就是子类具有父类的所有特性,包括所有数据和行为。因此,子类是父类,是一种特殊的父类。因此,在应用继承这种思想时,需要考虑清楚两件事情:
1)谁与谁之间存在继承关系?
2)需设计哪些数据和行为,用于继承?
当存在多重继承、多级继承时,这些问题就变得更加复杂。识别哪些对象之间存在继承关系,并不是一件容易的事情。尤其多级继承时,很多父类、祖父类在现实中都是不存在的,是抽象出来的。需要哪些数据、设计怎样的接口,用于继承?没有任何书来讲解这方面的内容。因为这是与项目的实际需求相关的,没有统一的标准答案。这就需要具体问题具体分析,灵活运用。

再说封装。封装,可以说是面向对象思想的最核心思想!封装的本质在于,封装了内部的数据,封装了内部的实现过程,对外界不可见。这样就创造了一个与外界隔离的环境,在这个环境中,可以自由改变内部的数据,改变内部的逻辑处理过程,只要保持对外的接口不变,外界就不受任何影响。这样修改这个类就不影响项目中的其它类,把业务逻辑的具体实现过程控制在一个固定的范围中,调试、修改、升级都很方便,项目变得可控。
因此,封装带来的好处是将复杂问题逐步分解,各实现部分隔离、解耦,从而使各个类之间、各模块间、各子系统间可以约定接口,并在实现上各自独立变化,从而可以分层设计。
因此,设计模式、架构分析与设计,都广泛采用封装思想。
应用封装时,要想清楚如下问题:
1)封装什么?
2)暴露什么?
3)接口如何设计?
没有任何书来讲解着方面的内容。这是与项目的具体需求相关的,没有标准答案。需要具体问题具体分析,灵活运行。

继承和多态,解决的是从对象之间从上而下、垂直方向的关系问题;而封装,解决的是对象与对象之间水平方向的协作问题。

想成为高水平的程序员,优秀的软件设计师、资深的系统架构师,那就反复研读面向对象吧,在项目中实践、思考、再实践、再思考!

猜你喜欢

转载自kong-desheng.iteye.com/blog/613766