
第2章 如何以对象的方式进行思考
在第1章中,我们学习了面向对象的基本概念。本书的其他部分会深入讲解这些概念,也会介绍一些其他的知识。不管是否是面向对象设计,出色的设计都需要考量很多因素。面向对象设计的基本单位是类。面向对象设计渴望的结果是一个健壮实用的对象模型,换句话说就是一个完整的系统。
在解决问题时并不只有一种方式,生活中很多事情都是如此。同一件事通常有多种处理方式。所以试图用面向对象的方案来进行设计时,不要执迷于一开始就尝试做出一个完美的设计(始终存在提升的空间)。我们真正需要做的是进行头脑风暴,让我们的思想延伸到不同的方向。当解决一个问题时不要尝试遵从任何标准或约定,因为整个想法都需要有创造性。
事实上,刚开始时甚至不要先考虑具体的编程语言。业务上的首要事情是定位和解决业务问题。要先进行概念分析和设计。只有业务问题需要技术来解决时才需要考虑具体的技术。例如,你不能脱离无线技术来设计一个无线网络。而且通常的现实情况是你有多种软件方案可供选择。
因此,在开始设计一个系统甚至一个类之前,先思考问题本身并从中获得乐趣。本章中,我们探索了面向对象的思考这一艺术和科学。
关于思考的任何微小改变都是不平凡的。比如我们反复提及的从结构化开发方式变为面向对象开发的思维。之前已经讲过,该思维的一个误解是结构化开发过程和面向对象的开发过程是互斥的。其实并不是这样。众所周知,之前我们讨论过,通过包装对象,结构化开发和面向对象开发是可以共存的。事实上,当编写面向对象的应用程序时,到处在用结构化的结构体。我还从没看到过一个程序(无论是否采用了面向对象)没有使用循环、条件判断等。转换到面向对象设计需要不同类型的投资。
从FORTRAN语言切换到COBOL语言(甚至C语言)相当于学习新的语言。然而,从COBOL语言切换到C++、C#.NET、Visual Basic.Net、Objective-C、Swift,或者Java则要求学习一种新的思考过程。这正是过度使用术语面向对象范式造成的后果。当学习面向对象语言时,你必须首先花精力来学习面向对象的概念以及相应的思考过程。如果没有进行这种模式的转变,以下两件事情必发生其一。要么是项目本质上不是真正的面向对象(例如,使用了C++语言但没有使用面向对象构造),要么是项目完全由混乱的对象组成。
培养面向对象思考过程的良好习惯需要注意三个方面,本章会进行详细讲解:
·清楚接口和实现之间的区别
·抽象地思考
·给用户提供尽可能少的接口
第1章中我们已经接触到了部分概念,接下来我们会深入细节。