读《编程匠艺—编写卓越的代码》:源代码的版面与样式

《新约.约翰福音》:
不可按外貌断定是非,总要按公平断定是非

一、重要的版面与样式

  • 程序员根据代码的版面理解代码的含义。
  • 版面可以说明和支持代码的结构,帮组阅读者理解代码真实的内容。
  • 可以说,版面和样式是区分优秀代码和糟糕代码的一个主要特征。
  • 我们有理由认为,版面漂亮的代码是经过精心设计的代码。更有理由认为,格式混乱的代码一定没有好好下功夫。

二、了解你的读者

为了写出有效的源代码,我们需要了解谁会阅读这些代码。我们有三类读者:

  • 我们自己
    你不仅需要能够读懂刚刚写下的代码,也需要若干年后仍然能明白它的含义。

  • 编译器
    只要没有语法错误,编译器并不在乎你的代码样式是否美观

  • 其他人
    它们是最重要的,也是最容易被忽视的读者群。

很显然,编译器对我们的影响最小。我们使用版面与样式,是向人类读者强调代码的逻辑结构。这是一种沟通,应当越清晰越好

三、什么是好的样式

下面是几种衡量样式风格质量的标准:

  • 一致

《C程序设计语言》中Kernighan和Ritchie:
括号的位置并不重要,尽管人们固执己见。我们从几种流行的风格中选择一种即可。挑选一种适合你的风格,然后坚持使用下去

不管在什么情况下,大小括号的位置,缩进的空格数等应当前后一致

  • 传统
    采用一种业内流行的主要样式,比自己创造一种缩进规则要明智得多。这样阅读你代码的人更容易接受和理解你的代码

  • 简洁

四、了解常用代码版面风格

我们应当认识我们所选择的语言的常用代码版面风格,充分了解它们的优缺点,再根据你的审美观、你所处的编程文化以及你的习惯等,选择一种合适自己的风格。

下面是几种常用的括号位置风格

  1. K&R风格
int k_and_r ( ) {
     int a = 0, b = 0;
     while (a != 10){
           b++;
           a++;
    }
    return b;
}

优点占用空间较小,一屏可以显示更多的代码;后括号与对应的语句缩进相同,容易找到括号所终止的构造
缺点前后括号上下不对齐,视觉上不匹配;如果页面右侧的前括号丢失,不易察觉;代码语句看上去缩在一团

为了让印刷页的利用率最大化,在杂志中常使用K&R风格。

  1. 悬挂式
int  hang ( ) 
{
     int a = 0, b = 0;
     while (a != 10)
     {
           b++;
           a++;
     }
     return b;
}

优点格式清晰整洁;由于前后括号明显,利于区分代码块,易于浏览代码
缺点占用竖向空间较多;如果有很多只包含一条语句的代码块,很浪费空间

  1. 缩进的括号风格
int  indented ( ) 
     {
     int a = 0, b = 0;
     while (a != 10)
          {
           b++;
           a++;
           }
     return b;
     }

优点将代码块以及包括代码块的括号联接在一起
缺点许多人并不喜欢

  1. 其他风格
    GNU:介于悬挂式和缩进式之间的一种风格,把括号放置在各个缩进级别一半的位置上;
    Linux内核:一半是K&R,一半是悬挂式;

五、选择风格

程序员们常常在编码风格的选择上发生分歧,甚至成为了一种信仰之争,更不幸的是,这种强烈的意见分歧有时蜕变成相互的漫骂和攻击。

我们应当了解:

只要你编写代码时使用的风格是好的,具体使用哪种风格并不重要

所以我们不争论哪种风格更好,只需:

选择一种好的编码风格,并坚持使用它

六、内部风格

许多软件公司都有自己的内部编码风格,内部风格将提高代码的质量,并使软件开发更安全。具体好处如下:

  • 任何向公司外部发布的代码,其样式整洁一致,会显得有整体规划,显得更职业化。
  • 有统一的句式和方法,能保证写出来的程序符合同一个标准,有助于防止出现糟糕的代码。
  • 你可立即看懂同行的代码,能快速地维护,节约阅读时间,节省公司资金。

建议:

如果你的团队已有一个编码标准,那么使用这个标准,
即使内部样式跟你的个人偏好相矛盾

七、设立标准

如果你被安排来草拟一份编码标准,那么祝你好运!

这项任务的难度取决于团队的成员:

  • 团队由多少位程序员?
  • 他们如何单独编写代码的?
  • 他们的编码风格是否统一?
  • 他们是否想要一套标准?
  • 他们已经做好改变编码风格的准备了吗?

下面是为这项艰巨任务提供的几条实用建议:

  • 界定任务范围
    你要确定这个任务是为你的直属团队,还是为一个部门或整个公司。对象不同,标准内容和实施方式也会不同。

  • 赢得广泛参与
    (a).在设立标准之前,让每个人都赞成需要出台一个标准;让他们理解代码一致的好处,以及特立独行的代码样式的危害。
    (b).让团队的人尽量参与制定标准,他们将更有可能遵循标准。
    (c).如果你的团队有很多程序员,不要尝试让所有人参与,而是选择一个精明强干的小组完成这项任务。

  • 做出成果
    把所有标准写成一个可理解的文档,可供查阅和参考。文档不但包含一系列规则,还要有相应的解释(尤其是对有争议的条款)。

  • 使最佳做法标准化
    确保标准体现团队目前最佳的做法,让大家知道他们正在作正确的事。

  • 突出重点
    如果你只使用C语言,就不要为C、C++、Java语言都创建样式标准吧。

  • 逐步完善
    一种明智的做法,是一次只完善一小部分内部风格。比如先确定括号布局和缩进,当大家都接受和执行之后,再实施其他的标准。

  • 为推广做计划
    不要采用惩罚措施,但可以采用一些激励办法,如在代码审核时进行一个公开的表扬。

八、正义的战争

乔治.奥威尔(George Orwell):
要结束一场战争,最快的办法是输掉它

在编程社会中,代码版面不是唯一的烫手山芋,会引起争议的地方还有很多,如编辑器、编译器、方法论、最好的语言。

作为一名职业程序员,我们应当从这些无谓的争论中脱身。我们要有有根据的个人意见,但不能傲慢地认为自己就是对的。

你可能感兴趣的:(读《编程匠艺—编写卓越的代码》:源代码的版面与样式)