没有合适的资源?快使用搜索试试~ 我知道了~
首页提升程序设计实践:风格与效率的关键
提升程序设计实践:风格与效率的关键
需积分: 0 9 下载量 156 浏览量
更新于2024-07-20
收藏 8.7MB PDF 举报
"《程序设计实践》是一本专注于实用编程技巧的书籍,它强调了良好的程序设计风格在编写高效、易读且易于维护代码中的核心地位。作者引用William Strunk和E.B. White的观点,指出优秀的作家即使打破常规也能传达价值,但在编程中,遵循既定的规则和风格至关重要,因为它们有助于提升代码的可理解性和一致性。 章节一开始,作者通过一段示例代码来说明,尽管代码可能功能完备,但如果注释存在歧义或遗漏,如在提及国家名称时没有解释它们之间的关系,将可能导致读者困惑。作者强调,程序不仅需要满足语法规范,运行有效,还要易于理解和修改。因此,这本书的目标是教导读者如何从编写之初就设计出高质量的代码,并在代码的迭代过程中不断优化,避免常见的问题和弱点。 书中特别关注程序设计风格,认为它对于程序员自身和团队协作至关重要。风格的原则基于实践经验,提倡简洁明了的逻辑,清晰的表达,标准语言用法,有意义的命名以及有助于理解的注释。作者反对使用过于复杂或非标准的技巧,强调代码的一致性,即所有成员遵循统一的风格,这样可以提高代码的可读性,降低学习成本。 此外,书中提到,程序设计风格并非随意制定,而是源自于对最佳实践的共识,可以通过团队内部的规范、指导文档或者一致性的编码约定来实现。通过深入讨论风格问题,作者引导读者认识到,良好的程序设计不仅仅是技术层面的,更是关于沟通和协作的艺术,它能够显著提升软件开发的效率和质量。"
资源详情
资源推荐
通过给上面的计算中出现的各个数命名,我们可以把代码弄得更清楚些。我们发现,例如
数字3是由( 8 0-1 ) / 2 6得到的,而l e t应该有2 6个项,而不是2 7个(这个超一( o ff - b y - o n e )错误可能是
由于写程序的人把屏幕坐标当作从1开始而引起的)。通过一些简化后,我们得到的结果代码是:
现在,主循环到底做什么已经很清楚了:它是一个熟悉的从 0到N L E T 的循环,是一个对数据
(数组)元素操作的循环。程序里对 d r a w 的调用也同样容易理解,因为像 M A X R O W和M I N C O L这
样的词提醒我们实际参数的顺序。更重要的是,现在我们已经很容易把这个程序修改为能够
对付其他的屏幕大小或不同的数据了。数被揭掉了神秘的面纱,代码的意义也随之一目了然
了。
把数定义为常数,不要定义为宏。 C程序员的传统方式是用# d e f i n e 行来对付神秘的数值。 C
语言预处理程序是一个强有力的工具,但是它又有些鲁莽。使用宏进行编程是一种很危险的
方式,因为宏会在背地里改变程序的词法结构。我们应该让语言去做正确的工作 。在C和
C++ 里,整数常数可以用枚举语句声明,就像上面的例子里所做的那样。在 C + + 里任何类型
都可使用c o n s t声明的常数:
在J a v a中可以用f i n a l 声明:
C语言里也有c o n s t 值,但它们不能用作数组的界。这样, e n u m 就是C中惟一可用的选择了。
使用字符形式的常量,不要用整数。人们常用在< c t y p e . h > 里的函数,或者用与它们等价的
内容检测字符的性质。有一个测试写成这样:
16计计程序设计实践
下载
注意,C预处理命令不是C语言本身的组成部分,而是一组辅助成分。这里说“让语言……”,也就是说不
要用预处理命令做。
—
译者
这种写法将完全依赖于特殊的字符表示方式。写成下面这样更好一些:
但是,如果在某个编码字符集里的字母编码不是连续的,或者其中还夹有其他字母,那么这
种描述的效果就是错的。最好是直接使用库函数,在 C和C++ 里写:
或在J a v a 里面:
与此类似的还有另一个问题,那就是程序里许多上下文中经常出现的 0。虽然编译系统会
把它转换为适当类型,但是,如果我们把每个 0的类型写得更明确更清楚,对读程序的人理解
其作用是很有帮助的。例如,用 (v o i d *) 0 或N U L L 表示C里的空指针值,用 ‘\ 0 ’而不是0表示
字符串结尾的空字节。也就是说,不要写:
应该写成:
我们赞成使用不同形式的显式常数,而把 0仅留做整数常量。采用这些形式实际上指明了有关
值的用途,能起一点文档作用。可惜的是,在 C++ 里人们都已接受了用 0 ( 而不是 N U L L) 表示
空指针。J a v a为解决这个问题采用了一种更好的方法,它定义了一个关键字 n u l l ,用来表示
一个对象引用实际上并没有引用任何东西。
利用语言去计算对象的大小。不要对任何数据类型使用显式写出来的大小。例如,我们应该
用 s i z e o f ( i n t ) 而不是 2或者 4。基于同样原因,写 s i z e o f (a r r a y [ 0 ] ) 可能比
s i z e o f (i n t) 更好,因为即使是数组的类型改变了,也没有什么东西需要改变。
利用运算符s i z e o f 常常可以很方便地避免为数组大小引进新名字。例如,写:
这里的缓冲区大小仍然是个神秘数。但是它只在这个声明中出现了一次。为局部数组的大小
引进一个新名字价值并不大,而写出的代码能在数据大小或类型改变的情况下不需要任何改
动,这一点肯定是有价值的。
J a v a语言中的数组有一个l e n g t h域,它给出数组的元素个数:
在C和C + + 里没有与 .l e n g t h 对应的内容。但是,对于那些可以看清楚的数组 (不是指针),
下面的宏定义能计算出数组的元素个数:
第 1章 风 格计计17
下载
在这里,数组大小只在一个地方设置。如果数组的大小改变,其余代码都不必改动。对函数
参数的多次求值在这里也不会出问题,因为它不会出现任何副作用,事实上,这个计算在程
序编译时就已经做完了。这是宏的一个恰当使用,因为它做了某种函数无法完成的工作,从
数组声明计算出它的大小。
练习1-10 如何重写下面定义,使出错的可能性降到最小?
1.6 注释
注释是帮助程序读者的一种手段。但是,如果在注释中只说明代码本身已经讲明的事情,
或者与代码矛盾,或是以精心编排的形式干扰读者,那么它们就是帮了倒忙。最好的注释是
简洁地点明程序的突出特征,或是提供一种概观,帮助别人理解程序。
不要大谈明显的东西。注释不要去说明明白白的事,比如 i + + 能够将i值加1等等。下面是我
们认为最没有价值的一些注释:
所有这些都该删掉,它们不过是一些无谓的喧嚣。
注释应该提供那些不能一下子从代码中看到的东西,或者把那些散布在许多代码里的信
息收集到一起。当某些难以捉摸的事情出现时,注释可以帮助澄清情况。如果操作本身非常
明了,重复谈论它们就是画蛇添足了:
18计计程序设计实践
下载
这些注释也都应该删除,因为仔细选择的名字已经携带着有关信息。
给函数和全局数据加注释。注释当然可以有价值。对于函数、全局变量、常数定义、结构和
类的域等,以及任何其他加上简短说明就能够帮助理解的内容,我们都应该为之提供注释。
全局变量常被分散使用在整个程序中的各个地方,写一个注释可以帮人记住它的意义,
也可以作为参考。下面是从本书第 3章取来的一个例子:
放在每个函数前面的注释可以成为帮人读懂程序的台阶。如果函数代码不太长,在这里
写一行注释就足够了。
有些代码原本非常复杂,可能是因为算法本身很复杂,或者是因为数据结构非常复杂。
在这些情况下,用一段注释指明有关文献对读者也很有帮助。此外,说明做出某种决定的理
由也很有价值。下面程序的注释介绍了逆离散余弦变换 (inverse discrete cosine transform,
D C T )的一个特别高效的实现,它用在一个 J P E G 图像解码器里:
这个很有帮助的注释点明了参考文献,简短地描述了所使用的数据,说明了算法的执行情况,
还说明为什么原来的代码应该修改,以及做了怎样的修改等等。
不要注释差的代码,重写它。应该注释所有不寻常的或者可能迷惑人的内容。但是如果注释
的长度超过了代码本身,可能就说明这个代码应该修改了。下面的例子是一个长而混乱的注
释和一个条件编译的查错打印语句,它们都是为了解释一个语句:
第 1章 风 格计计19
下载
否定性的东西很不好理解,应该尽量避免。在这里,部分问题来自一个毫无信息的变量名字
r e s u l t 。改用另一个更具说明性的名字 m a t c h f o u n d之后,注释就再没有存在的必要,打
印语句也变得清楚了:
不要与代码矛盾。许多注释在写的时候与代码是一致的。但是后来由于修正错误,程序改变
了,可是注释常常还保持着原来的样子,从而导致注释与代码的脱节。这很可能是本章开始
的那个例子的合理解释。
无论产生脱节的原因何在,注释与代码矛盾总会使人感到困惑。由于误把错误注释当真,
常常使许多实际查错工作耽误了大量时间。所以,当你改变代码时,一定要注意保证其中的
注释是准确的。
注释不仅需要与代码保持一致,更应该能够支持它。下面的例子里的注释是正确的,它
正确地解释了后面两行的用途。但细看又会发现它与代码矛盾,注释中谈的是换行,而代码
中说的则是空格:
一个可能的改进是采用惯用法重写代码:
现在注释和代码一致了。但是这两者都还可以进一步改进,应该写得更直截了当些。这里要
解决的问题就是删除函数 c t i m e返回时放在字符串最后的换行字符。注释里应该说明这个情
况,代码也应该是做这件事:
最后这个表达式是在C语言里截去字符串最后字符的习惯写法。现在代码变短了,注释也支持
它,解释了为什么这个语句需要做。
20计计程序设计实践
下载
剩余198页未读,继续阅读
Zpadger
- 粉丝: 145
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功