4.2 目标和工具
程序员的任务就是将计算表达出来,并且做到:
·正确;
·简单;
·高效。
请注意上述顺序。一个输出错误结果的快速程序是没有任何意义的。同样,一个正确、高效但是非常复杂的程序,最终的结果往往是被放弃或者重写。注意,为了适应不同的需求和硬件环境,有用的程序总会被无数次改写。因此,一个程序,或者它的任一子程序,应该以尽可能简单的方式来实现。举个例子,假设你为学校的孩子写了一个非常棒的算术教学程序,但是这个程序的内部组织非常糟糕。这个程序必须与孩子们交互。那它应该用什么语言呢?英语?又或是西班牙语?如果程序要在芬兰或科威特用,那又该怎么办呢?无疑,为了能适应不同地区的需要,程序使用的交互语言必须能够被修改。如果程序的结构非常混乱,那么原本逻辑上很简单的修改操作会变成一项艰巨的任务。
在我们开始编写代码的时候,就要特别关注正确、简单和高效这三个基本原则,这也是专业程序员的最重要职责。在实际工作中,遵循这些原则意味着代码仅仅能用是不够的,我们必须认真考虑代码的结构。一个看似矛盾的事实是,关注代码结构和“代码质量”是程序取得成功的最快途径。这一点很好理解:编程时对编码结构和质量所付出的努力,可以大大简化最令人沮丧的编程工作——调试。这是因为好的程序结构不但可以减少错误的发生,而且还能缩短发现并改正错误的时间。
程序的组织体现了程序员的编程思路,目前的手段主要是把一个大的计算任务划分为许多小任务。这一技术主要包括两类方法:
·抽象:即不需要了解的程序具体实现细节被隐藏在相应的接口之后。例如,为了实现电话本的排序,我们不需要了解排序算法的细节(已经有很多书讨论如何排序了),我们要做的只是调用C++标准库中的sort算法就可以了。关于排序,我们只需知道如何调用此算法,因此我们可以编写sort(b),其中b表示电话本;sort()是标准库中sort算法(16.8节,附录C5.4)的一个变种(16.9节),定义在std_library.h。另一个例子是内存的使用,直接使用内存空间是一个糟糕的想法。通常,我们通过变量(3.2节)、标准库vector(4.6节,12~14章)和map(16章)等来访问内存。 ...