编码风格不是编码规范

oschina
 oschina
发布于 2013年07月01日
收藏 83

我并不认为程序员是一个情绪特别丰富的群体。但有一些事情却能很容易刺激程序员的神经,那就是代码格式和布局。如果看到一个函数的括弧在同一行上没有闭合,我的眼睛会喷血。如果看到有人没有恰好的在两个函数间留一空行,我的小腿会抽筋。但重点在这里——除非是在家里开发自己的业余爱好软件,我的这些个人喜好其实是无关紧要的。同样,作为一个团队中的一员,你的个人编程喜好也应该放到一边。

编码风格很容易会和编码规范混为一谈,因为这两个词经常会被人换着使用。我认为,编码规范同时包括了编码风格和其它规范,不仅仅指代码格式。例如,像“返回成功/失败的函数应该用一个整数作为返回值”,这样的规则不属于编码风格。在这篇文章中,编码风格简单的指一个描述如何格式化代码的说明。编码风格中的规则通常会涉及到下面这些主题:

  • 缩进
  • 空格使用
  • Tab使用
  • 注释
  • 命名习惯
  • 代码行长度
  • 语言特点风格,例如是否使用可有可无的分号

编 码风格都是为特定的编程语言制定的,可以把它们看作“我们共同的约定”。如果在你的公司里,在你在时,在这些事情正在制定完成,你可以提出你的喜好,那你 是幸运。但通常情况是,一种编码风格在其生命期里看着无数的程序员来了又走了。在我的眼里,遵守编码风格有下面三个主要好处:

1. 遵守编码风格使代码更容易维护

今 天由这个程序员实现的软件,明天可能需要另外一个程序员维护。如果所有代码中大家使用同一种编码风格,这另外一个程序员快速的扫一眼陌生的代码,就能根据 大家约定的编程习惯,推断出代码的作用。如果编码风格中指明常量应该全用大写字母表示,那么,当看到一个全是大写字母的变量时,你就能推断出它是常量。同 样的,如果编码风格中规定包的引入要有顺序,那你立刻就能知道去哪里找这些包。这使得代码很容易维护。

2. 编码风格使形成代码集体所有制

代码集体所有制意味着全体程序员要负责所有代码。集体所有制的作用很大,它能有效的增大巴士因子——一个项目能承受多少个程序员被车撞了而不影响项目的正常进行。在整个代码库中坚持延用一种常用的编码风格,所以程序员都能更容易的理解、维护。

相反,如果在一个大型的软件项目中,每个程序员都使用自己的编码风格,最终会引起一场维护版图的战争,就像动物世界里我们的这些朋友:

气味记号(也称喷洒尿液或领土记号)是动物标记自己领土范围的一种行为。通常是通过留下具有强烈气味的物质来完成,很多时候是通过在领土中突出的物体上小便。-维基百科

个人编码风格就像是狗撒尿,留下自己的势力记号。他们在代码中留下自己的符号,在程序员之间创造壁垒。

3. 编码风格能消除那些长久的纷争

每 个程序员都对编码风格有强烈的自我认同。这种感觉深植于每个人的自负中,每当和同事遇到是否应该在关键词周围使用空格时,这种讨论很容易升级而僵持不下。 但是,静下来想想——这真的无所谓。不管是不是在关键词周围使用了空格,只要能达成一致,大家都能从中获得易维护和集体所有制的好处。在这种情况中,闭着 眼睛,遵循一种编码风格就行了。

你不需要喜欢这种编码风格。如果你不喜欢里面的某条规定,那就骂几句这个文档,只向文档发脾气,就像人类迁怒于上帝。然后还是按照约定做事。这样做更具有建设性,比无休无止的吵论这些不重要的事情好的多。

有了一套编码风格并不一定会给你带来好处——除非大家都遵守。有些时候,你并不一定需要手工去调整代码。很多的程序编程器,例如Eclipse,能配置帮你格式化代码,使其符合编码风格。即使你的编辑器没有这种功能,很多其它工具也能够自动按照某种风格格式化一个文件。在我们的团队中,我们使用 indent 和 uncrustify 工具。我还听说过一些其它好东西,比如ReSharper。那些不能被自动实施的规则,例如命名习惯,可以在代码审查的过程中落实。

你有什么想法?你们团队中采用了什么标准和约定?它们带来了什么好处?请写在评论里。我会很高兴看到讨论。

[英文原文: The conventions we follow ]
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:编码风格不是编码规范
加载中

最新评论(20

帆船
帆船
在掌握了源代码的情况下,我觉得搜索一下方法中的error_message会很方便。查手册还是要再回到代码里头才能解决问题。手册与代码分离也不方便。
Jackarain
Jackarain

引用来自“帆船”的评论

为什么我觉得返回“成功/失败”的方法应该返回一个字符串说明原因呢?

用c++ boost的error_code, 就有字符串说明原因, 参考项目: http://git.oschina.net/jackarain/avhttp
赵亮-碧海情天
赵亮-碧海情天

引用来自“帆船”的评论

为什么我觉得返回“成功/失败”的方法应该返回一个字符串说明原因呢?

因为随着情况变化,这个原因可能需要被扩充或其它修改。而且分散写在各个函数中不利于统一管理。如果在一个数据结构中统一对各种错误值进行说明,会更好,这也是大多数软件甚至操作系统采用的方法。
帆船
帆船

引用来自“festal”的评论

#define TRUE FALSE

这个真心亮瞎了氪金眼。
Nemesis_E
Nemesis_E
有各种SB级别的 风格 上次看代码就是 if乱换行 一不小心就掉坑了 各种日
f
festal
#define TRUE FALSE
linshenqi
linshenqi
每个人只要保持自己的风格统一就行,每次在维护别人的代码时,让我痛苦的一般不会是风格问题。
KenSun
KenSun
语言强制规定下不就行了,一切不符合规定的都是不合法的。。。这种问题原本就不应被用来讨论的
jQer
jQer
编码风格就是编码规范的其中之一。
你必须要约定别人和你都采用多少个空格的缩进。
姬仲春
姬仲春

引用来自“帆船”的评论

为什么我觉得返回“成功/失败”的方法应该返回一个字符串说明原因呢?

亲,有文档说明就行了,为啥要多余的解析呢
返回顶部
顶部