第3章 面向对象设计
本章内容
什么是面向对象的程序设计
如何定义不同对象之间的关系
抽象的重要性以及如何在设计中使用抽象
在第2章,您已经有了对良好软件设计的正确认识,现在可以将对象的概念以及良好设计的概念组合在一起。在代码中使用对象的程序员与真正掌握了面向对象程序设计的程序员是不同的,后者能更完美地管理对象相互联系的方式以及程序的总体设计。
本章以面向过程编程(www.cppentry.com)到面向对象编程(www.cppentry.com)的转换开始。即使您已经有多年使用对象的经验,仍然应该阅读本章了解关于对象的新思想。本章讨论对象之间的不同关系,包括创建面向对象程序时可能遇到的陷阱。您还将学习抽象原则如何与对象联系起来。
当从面向过程编程(www.cppentry.com)(C-风格)转换到面向对象编程(www.cppentry.com)时,需要记住的最重要的一点是,面向对象程序设计(OOP)只是以不同的方式看待程序。程序员在完全理解什么是对象之前,经常被新的语法以及OOP术语所困惑。本章轻视代码而重视概念以及思想。关于C++(www.cppentry.com)对象的特定语法,可以参阅第6章、第7章以及第8章。
3.1 过程化的思考方式
过程语言(例如C)将代码分割为小块,每个小块(理论上)完成单一的任务。如果在C中没有过程,所有的代码都会集中在main()中。您的代码将难于阅读,您的同事会觉得恼火,这还是最轻的。
计算机并不关心代码是位于main()中还是被分割成具有描述性名称以及注释的小块。过程是一种抽象,它的存在是为了帮助您、程序员以及阅读或者维护代码的人。这个概念建立在一个与程序相关的基本问题之上-- 程序究竟做什么?用英语回答这个问题,就是过程化思考。例如,您可以下面的答案为起点设计一个股票选择程序:首先程序从Internet获取股票报价,然后根据特定的指标将数据排序,之后分析已经排序的数据,最后输出一个建议购买以及出售的列表。当开始编写代码的时候,您可能会将脑海中的模型直接转换为C函数:
- retrieveQuotes()、 sortQuotes()、analyzeQuotes()和outputRecommendations()
尽管C将过程表示为"函数",但C并非是一门函数式语言。术语"函数式(functional)"与"过程(procedural)"有很大的不同,指的是类似于Lisp的语言,Lisp使用的是完全不同的抽象。
当程序遵循特定的步骤序列时,过程方法运行良好。然而,在现代的大型应用程序中,很少有线性的事件序列,通常用户可以在任何时候执行任何命令。此外,过程思想对于数据的表示没有任何的说明,在前面的示例中,并没有讨论股票报价实际上是什么。
如果过程模型听起来像您处理程序的方法,不要担心。一旦您意识到OOP只是一种更灵活的替代方法,只是一种对软件的思考方法,面向对象编程(www.cppentry.com)就会变得十分自然。