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

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

一、重要的版面与样式

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

二、了解你的读者

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

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

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

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

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

三、什么是好的样式

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

  • 一致

《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):
要结束一场战争,最快的办法是输掉它

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 查尔斯.普雷斯特.斯科特(Charles Prestwich Scott):评论是自由的,但事实是神圣的 注释可以...
    思学阅读 1,007评论 0 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,422评论 21 35
  • 茫茫人海中 就这么一眼 你便成为唯一 你那迷人的眼眸 毒我一见钟情 毒我念念不忘 令我心头小鹿 到处乱窜 我试图着...
    独木前行阅读 111评论 0 2
  • 今天是新精英生涯咨询师执业班上课的第五天。 如往常一样,自己提前醒了,太累了,没有睁开眼。当早晨的闹钟响起时,自己...
    杨瑜茹生涯咨询师阅读 263评论 0 0