没有合适的资源?快使用搜索试试~ 我知道了~
首页the practice of programming第一部分
the practice of programming第一部分
需积分: 6 35 下载量 11 浏览量
更新于2023-03-03
评论
收藏 1.2MB PDF 举报
Pike和Kernighan的The Practice of Programming帮助你整理一下,在程序设计中应该有哪些注意的事项。这本可以说是程序员必读的指南
资源详情
资源评论
资源推荐
下载
第1章 风 格
人们看到最好的作家有时并不理会修辞学的规则。还好,当他们这样做虽然付
出了违反常规的代价,读者还经常能从句子中发现某些具有补偿性的价值。除非作
者自己也明确其做法的意思,否则最好还是按规矩做。
William Strunk和E. B. White,《风格的要素》
下面这段代码取自一个许多年前写的大程序:
这段代码写得很仔细,具有很好的格式。它所在的程序也工作得很好。写这个系统的程序员会
对他们的工作感到骄傲。但是这段摘录却会把细心的读者搞糊涂:新加坡、文莱、波兰和意大
利之间有什么关系?为什么在注释里没有提到意大利?由于注释与代码不同,其中必然有一个
有错,也可能两个都不对。这段代码经过了执行和测试,所以它可能没有问题。注释中对提到
的三个国家间的关系没有讲清楚,如果你要维护这些代码,就必须知道更多的东西。
上面这几行实际代码是非常典型的:大致上写得不错,但也还存在许多应该改进的地方。
本书关心的是程序设计实践,关心怎样写出实际的程序。我们的目的是帮助读者写出这
样的软件,它至少像上面的代码所在的程序那样工作得非常好,而同时又能避免那些污点和
弱点。我们将讨论如何从一开始就写出更好的代码,以及如何在代码的发展过程中进一步改
进它。
我们将从一个很平凡的地方入手,首先讨论程序设计的风格问题。风格的作用主要就是
使代码容易读,无论是对程序员本人,还是对其他人。好的风格对于好的程序设计具有关键
性作用。我们希望最先谈论风格,也是为了使读者在阅读本书其余部分时能特别注意这个问
题。
写好一个程序,当然需要使它符合语法规则、修正其中的错误和使它运行得足够快,但
是实际应该做的远比这多得多。程序不仅需要给计算机读,也要给程序员读。一个写得好的
程序比那些写得差的程序更容易读、更容易修改。经过了如何写好程序的训练,生产的代码
更可能是正确的。幸运的是,这种训练并不太困难。
程序设计风格的原则根源于由实际经验中得到的常识,它不是随意的规则或者处方。代
码应该是清楚的和简单的
—
具有直截了当的逻辑、自然的表达式、通行的语言使用方式、
有意义的名字和有帮助作用的注释等,应该避免耍小聪明的花招,不使用非正规的结构。一
致性是非常重要的东西,如果大家都坚持同样的风格,其他人就会发现你的代码很容易读,
你也容易读懂其他人的。风格的细节可以通过一些局部规定,或管理性的公告,或者通过程
序来处理。如果没有这类东西,那么最好就是遵循大众广泛采纳的规矩。我们在这里将遵循
《C程序设计语言》(The C Programming Language)一书中所使用的风格,在处理 J a v a和C++ 程
序时做一些小的调整。
我们一般将用一些好的和不好的小程序设计例子来说明与风格有关的规则,因为对处理
同样事物的两种方式做比较常常很有启发性。这些例子不是人为臆造的,不好的一个都来自
实际代码,由那些在太多工作负担和太少时间的压力下工作的普通程序员 (偶然就是我们自己)
写出来。为了简单,这里对有些代码做了些精练,但并没有对它们做任何错误的解释。在看
到这些代码之后,我们将重写它们,说明如何对它们做些改进。由于这里使用的都是真实代
码,所以代码中可能存在多方面问题。要指出代码里的所有缺点,有时可能会使我们远离讨
论的主题。因此,在有的好代码例子里也会遗留下一些未加指明的缺陷。
为了指明一段代码是不好的,在本书中,我们将在有问题的代码段的前面标出一些问号,
就像下面这段:
为什么这些# d e f i n e 有问题?请想一想,如果某个具有 T W E N T Y个元素的数组需要修改得更大
一点,情况将会怎么样。至少这里的每个名字都应该换一下,改成能说明这些特殊值在程序
中所起作用的东西。
1.1 名字
什么是名字?一个变量或函数的名字标识这个对象,带着说明其用途的一些信息。一个名
字应该是非形式的、简练的、容易记忆的,如果可能的话,最好是能够拼读的。许多信息来
自上下文和作用范围(作用域)。一个变量的作用域越大,它的名字所携带的信息就应该越多。
全局变量使用具有说明性的名字,局部变量用短名字。根据定义,全局变量可以出现在整个
程序中的任何地方,因此它们的名字应该足够长,具有足够的说明性,以便使读者能够记得
它们是干什么用的。给每个全局变量声明附一个简短注释也非常有帮助:
全局函数、类和结构也都应该有说明性的名字,以表明它们在程序里扮演的角色。
相反,对局部变量使用短名字就够了。在函数里, n可能就足够了,n p o i n t s 也还可以,
用n u m b e r O f P o i n t s 就太过分了。
按常规方式使用的局部变量可以采用极短的名字。例如用 i、j作为循环变量,p、q作为
指针,s、t表示字符串等。这些东西使用得如此普遍,采用更长的名字不会有什么益处或收
获,可能反而有害。比较:
2计计程序设计实践
下载
和
人们常常鼓励程序员使用长的变量名,而不管用在什么地方。这种认识完全是错误的,清晰
性经常是随着简洁而来的。
现实中存在许多命名约定或者本地习惯。常见的比如:指针采用以 p结尾的变量名,例如
n o d e p ;全局变量用大写开头的变量名,例如 G l o b a l ;常量用完全由大写字母拼写的变量
名,如C O N S T A N T S 等。有些程序设计工场采用的规则更加彻底,他们要求把变量的类型和用
途等都编排进变量名字中。例如用 p c h 说明这是一个字符指针,用 s t r T o和s t r F r o m表示它
们分别是将要被读或者被写的字符串等。至于名字本身的拼写形式,是使用 n p e n d i n g 或
n u m P e n d i n g 还是n u m _ p e n d i n g ,这些不过是个人的喜好问题,与始终如一地坚持一种切
合实际的约定相比,这些特殊规矩并不那么重要。
命名约定能使自己的代码更容易理解,对别人写的代码也是一样。这些约定也使人在写
代码时更容易决定事物的命名。对于长的程序,选择那些好的、具有说明性的、系统化的名
字就更加重要。
C++ 的名字空间和 J a v a 的包为管理各种名字的作用域提供了方法,能帮助我们保持名字
的意义清晰,又能避免过长的名字。
保持一致性。相关的东西应给以相关的名字,以说明它们的关系和差异。
除了太长之外,下面这个J a v a 类中各成员的名字一致性也很差:
这里同一个词“队列 ( q u e u e )”在名字里被分别写为 Q、Q u e u e 或q u e u e 。由于只能在类型
U s e r Q u e u e里访问,类成员的名字中完全不必提到队列,因为存在上下文。所以:
完全是多余的。下面的写法更好:
因为这时可以如此写:
这样做在清晰性方面没有任何损失。在这里还有可做的事情。例如 i t e m s和u s e r s 实际是同一种
东西,同样东西应该使用一个概念。
函数采用动作性的名字。函数名应当用动作性的动词,后面可以跟着名词:
对返回布尔类型值(真或者假)的函数命名,应该清楚地反映其返回值情况。下面这样的语句
第 1章 风 格计计3
下载
是不好的,因为它没有指明什么时候返回真,什么时候返回假。而:
就把事情说清楚了:如果参数是八进制数字则返回真,否则为假。
要准确。名字不仅是个标记,它还携带着给读程序人的信息。误用的名字可能引起奇怪的程
序错误。
本书作者之一写过一个名为i s o c t a l的宏,并且发布使用多年,而实际上它的实现是错误的:
正确的应该是:
这是另外一种情况:名字具有正确的含义,而对应的实现却是错的,一个合情合理的名字掩
盖了一个害人的实现。
下面是另一个例子,其中的名字和实现完全是矛盾的:
函数 g e t I n d e x 如果找到了有关对象,就返回 0到n T a b l e -1 之间的一个值;否则返回
n T a b l e值。而这里 i n T a b l e 返回的布尔值却正好与它名字所说的相反。在写这段代码时,
这种写法未必会引起什么问题。但如果后来修改这个程序,很可能是由别的程序员来做,这
个名字肯定会把人弄糊涂。
练习1-1 评论下面代码中名字和值的选择:
练习1-2 改进下面的函数:
练习1-3 大声读出下面的代码:
1.2 表达式和语句
名字的合理选择可以帮助读者理解程序,同样,我们也应该以尽可能一目了然的形式写好表
达式和语句。应该写最清晰的代码,通过给运算符两边加空格的方式说明分组情况,更一般的是
通过格式化的方式来帮助阅读。这些都是很琐碎的事情,但却又是非常有价值的,就像保持书桌
整洁能使你容易找到东西一样。与你的书桌不同的是,你的程序代码很可能还会被别人使用。
4计计程序设计实践
下载
用缩行显示程序的结构。采用一种一致的缩行风格,是使程序呈现出结构清晰的最省力的方
法。下面这个例子的格式太糟糕了:
重新调整格式,可以改得好一点:
更好的是把赋值作为循环体,增量运算单独写。这样循环的格式更普通也更容易理解:
使用表达式的自然形式。表达式应该写得你能大声念出来。含有否定运算的条件表达式比较
难理解:
在两个测试中都用到否定,而它们都不是必要的。应该改变关系运算符的方向,使测试变成
肯定的:
现在代码读起来就自然多了。
用加括号的方式排除二义性。括号表示分组,即使有时并不必要,加了括号也可能把意图表
示得更清楚。在上面的例子里,内层括号就不是必需的,但加上它们没有坏处。熟练的程序
员会忽略它们,因为关系运算符 (< <= == != >= >)比逻辑运算符(& &和| |)的优先级更高。
在混合使用互相无关的运算符时,多写几个括号是个好主意。 C语言以及与之相关的语言
存在很险恶的优先级问题,在这里很容易犯错误。例如,由于逻辑运算符的约束力比赋值运
算符强,在大部分混合使用它们的表达式中,括号都是必需的。
字位运算符(&和| ) 的优先级低于关系运算符(比如= = ),不管出现在哪里:
实际上都意味着
这个表达式所表达的肯定不会是程序员的本意。在这里混合使用了字位运算和关系运算符号,
表达式里必须加上括号:
如果一个表达式的分组情况不是一目了然的话,加上括号也可能有些帮助,虽然这种括
第 1章 风 格计计5
下载
剩余21页未读,继续阅读
a215827879
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0