极客时间已完结课程限时免费阅读

32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)

32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)-极客时间

32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)

讲述:冯永吉

时长09:53大小7.91M

上一节课中我们讲了命名和注释,这一节课我们来讲一下代码风格(Code Style)。说起代码风格,我们其实很难说哪种风格更好。最重要的,也是最需要我们做到的,是在团队、项目中保持风格统一,让代码像同一个人写出来的,整齐划一。这样能减少阅读干扰,提高代码的可读性。这才是我们在实际工作中想要实现的目标。
关于代码风格,我总结了 6 点我认为最值得关注的,今天跟你一块讨论学习一下。

1. 类、函数多大才合适?

总体上来讲,类或函数的代码行数不能太多,但也不能太少。类或函数的代码行数太多,一个类上千行,一个函数几百行,逻辑过于繁杂,阅读代码的时候,很容易就会看了后面忘了前面。相反,类或函数的代码行数太少,在代码总量相同的情况下,被分割成的类和函数就会相应增多,调用关系就会变得更复杂,阅读某个代码逻辑的时候,需要频繁地在 n 多类或者 n 多函数之间跳来跳去,阅读体验也不好。
那一个类或函数有多少行代码才最合适呢?
我们在第 15 讲中提到过,要给出一个精确的量化值是很难的。当时我们还跟做饭做了类比,对于“放盐少许”中的“少许”,即便是大厨也很难告诉你一个特别具体的量值。
对于函数代码行数的最大限制,网上有一种说法,那就是不要超过一个显示屏的垂直高度。比如,在我的电脑上,如果要让一个函数的代码完整地显示在 IDE 中,那最大代码行数不能超过 50。这个说法我觉得挺有道理的。因为超过一屏之后,在阅读代码的时候,为了串联前后的代码逻辑,就可能需要频繁地上下滚动屏幕,阅读体验不好不说,还容易出错。
对于类的代码行数的最大限制,这个就更难给出一个确切的值了。我们在第 15 讲中也给出了一个间接的判断标准,那就是,当一个类的代码读起来让你感觉头大了,实现某个功能时不知道该用哪个函数了,想用哪个函数翻半天都找不到了,只用到一个小功能要引入整个类(类中包含很多无关此功能实现的函数)的时候,这就说明类的行数过多了。

2. 一行代码多长最合适?

Google Java Style Guide文档中,一行代码最长限制为 100 个字符。不过,不同的编程语言、不同的规范、不同的项目团队,对此的限制可能都不相同。不管这个限制是多少,总体上来讲我们要遵循的一个原则是:一行代码最长不能超过 IDE 显示的宽度。需要滚动鼠标才能查看一行的全部代码,显然不利于代码的阅读。当然,这个限制也不能太小,太小会导致很多稍长点的语句被折成两行,也会影响到代码的整洁,不利于阅读。

3. 善用空行分割单元块

对于比较长的函数,如果逻辑上可以分为几个独立的代码块,在不方便将这些独立的代码块抽取成小函数的情况下,为了让逻辑更加清晰,除了上一节课中提到的用总结性注释的方法之外,我们还可以使用空行来分割各个代码块。
除此之外,在类的成员变量与函数之间、静态成员变量与普通成员变量之间、各函数之间、甚至各成员变量之间,我们都可以通过添加空行的方式,让这些不同模块的代码之间,界限更加明确。写代码就类似写文章,善于应用空行,可以让代码的整体结构看起来更加有清晰、有条理。

4. 四格缩进还是两格缩进?

“PHP 是世界上最好的编程语言?代码换行应该四格缩进还是两格缩进?”这应该是程序员争论得最多的两个话题了。据我所知,Java 语言倾向于两格缩进,PHP 语言倾向于四格缩进。至于到底应该是两格缩进还是四格缩进,我觉得这个取决于个人喜好。只要项目内部能够统一就行了。
当然,还有一个选择的标准,那就是跟业内推荐的风格统一、跟著名开源项目统一。当我们需要拷贝一些开源的代码到项目里的时候,能够让引入的代码跟我们项目本身的代码,保持风格统一。
不过,我个人比较推荐使用两格缩进,这样可以节省空间。特别是在代码嵌套层次比较深的情况下,累计缩进较多的话,容易导致一个语句被折成两行,影响代码可读性。
除此之外,值得强调的是,不管是用两格缩进还是四格缩进,一定不要用 tab 键缩进。因为在不同的 IDE 下,tab 键的显示宽度不同,有的显示为四格缩进,有的显示为两格缩进。如果在同一个项目中,不同的同事使用不同的缩进方式(空格缩进或 tab 键缩进),有可能会导致有的代码显示为两格缩进、有的代码显示为四格缩进。

5. 大括号是否要另起一行?

左大括号是否要另起一行呢?这个也有争论。据我所知,PHP 程序员喜欢另起一行,Java 程序员喜欢跟上一条语句放到一起。具体代码示例如下所示:
// PHP
class ClassName
{
public function foo()
{
// method body
}
}
// Java
public class ClassName {
public void foo() {
// method body
}
}
我个人还是比较推荐,将括号放到跟语句同一行的风格。理由跟上面类似,节省代码行数。但是将大括号另起新的一行的方式,也有它的优势。这样的话,左右括号可以垂直对齐,哪些代码属于哪一个代码块,更一目了然。
不过,还是那句话,大括号跟上一条语句在同一行,还是另起新的一行,只要团队统一、业内统一、跟开源项目看齐就好了,没有绝对的优劣之分。

6. 类中成员的排列顺序

在 Java 类文件中,先要书写类所属的包名,然后再罗列 import 引入的依赖类。在 Google 编码规范中,依赖类按照字母序从小到大排列。
在类中,成员变量排在函数的前面。成员变量之间或函数之间,都是按照“先静态(静态函数或静态成员变量)、后普通(非静态函数或非静态成员变量)”的方式来排列的。除此之外,成员变量之间或函数之间,还会按照作用域范围从大到小的顺序来排列,先写 public 成员变量或函数,然后是 protected 的,最后是 private 的。
不过,不同的编程语言中,类内部成员的排列顺序可能会有比较大的差别。比如 C++ 中,成员变量会习惯性放到函数后面。除此之外,函数之间的排列顺序,会按照刚刚我们提到的作用域的大小来排列。实际上,还有另外一种排列习惯,那就是把有调用关系的函数放到一块。比如,一个 public 函数调用了另外一个 private 函数,那就把这两者放到一块。

重点回顾

好了,今天的内容到此就讲完了。我们一块来总结回顾一下,你需要重点掌握的内容。这一节课我们通过 6 点,来给你讲了代码风格中的注意点。
1. 函数、类多大才合适?
函数的代码行数不要超过一屏幕的大小,比如 50 行。类的大小限制比较难确定。
2. 一行代码多长最合适?
最好不要超过 IDE 显示的宽度。当然,限制也不能太小,太小会导致很多稍微长点的语句被折成两行,也会影响到代码的整洁,不利于阅读。
3. 善用空行分割单元块
对于比较长的函数,为了让逻辑更加清晰,可以使用空行来分割各个代码块。在类内部,成员变量与函数之间、静态成员变量与普通成员变量之间、函数之间,甚至成员变量之间,都可以通过添加空行的方式,让不同模块的代码之间的界限更加明确。
4. 四格缩进还是两格缩进?
我个人比较推荐使用两格缩进,这样可以节省空间,特别是在代码嵌套层次比较深的情况下。除此之外,值得强调的是,不管是用两格缩进还是四格缩进,一定不要用 tab 键缩进。
5. 大括号是否要另起一行?
我个人还是比较推荐将大括号放到跟上一条语句同一行的风格,这样可以节省代码行数。但是,将大括号另起一行,也有它的优势,那就是,左右括号可以垂直对齐,哪些代码属于哪一个代码块,更加一目了然。
6. 类中成员的排列顺序
在 Google Java 编程规范中,依赖类按照字母序从小到大排列。类中先写成员变量后写函数。成员变量之间或函数之间,先写静态成员变量或函数,后写普通变量或函数,并且按照作用域大小依次排列。
今天讲到所有的代码风格都没有对错和优劣之分,只要能在团队、项目中统一即可,不过,最好能跟业内推荐的风格、开源项目的代码风格相一致。

课堂讨论

聊一聊你熟悉的编程语言的代码风格,比如是四格缩进还是两格缩进?试着给自己的项目整理一份编程规范。
欢迎在留言区写下你的答案,和同学一起交流和分享。如果有收获,也欢迎你把这篇文章分享给你的朋友。
分享给需要的人,Ta购买本课程,你将得29
生成海报并分享

赞 45

提建议

上一篇
31 | 理论五:让你最快速地改善代码质量的20条编程规范(上)
下一篇
33 | 理论五:让你最快速地改善代码质量的20条编程规范(下)
 写留言

精选留言(89)

  • 辣么大
    置顶
    2020-01-15
    这阵争哥节奏放缓,大家都能歇歇。前些篇文章确实硬核。我每篇看下来加查资料来至少要两个小时,总这么整谁能扛得住呀。争哥加油!
    共 7 条评论
    66
  • 何用
    2020-01-15
    “不管是用两格缩进还是四格缩进,一定不要用 tab 键缩进。” ——— 老师的这个观点我持相反的意见。我是推崇使用 tab 缩进的,这样每个人可以根据自己的喜好,在 IDE 自行定义一个 tab 在视觉上等于几个空格,富于弹性。至于 tab 和空格缩进可能混用的问题,工具可以很好地帮我们解决。
    共 18 条评论
    46
  • 睁眼看世界
    2020-01-15
    打卡,在idea中安装alibaba规约以及google-java-format Settings 对于code style很有帮助。
    共 2 条评论
    31
  • J.Smile
    2020-01-15
    争哥,多来点硬核的,这种编码规范来的有点多了,我们公司经常组织的,哈哈😄!
    共 9 条评论
    12
  • 守拙
    2020-01-15
    简单看了下<Google Java Style Guide>: 源代码文件使用utf-8编码. 这一点容易被忽略,但还是挺重要的.
    8
  • 炫炫
    2020-05-18
    这里推荐阿里的规范
    5
  • Binary
    2020-01-16
    没有人发现Spring的源码全都是用tab缩进的吗,这是为什么呢?
    共 2 条评论
    5
  • 阿顺
    2020-01-15
    之前的个人经验:在使用vscode或者sublime等编辑器时,团队一定要统一formatter插件,最好的就是统一编辑器且统一formatter插件。不然不同的人使用不同的formatter插件进行开发,就会出现尽管你只修改了某一行代码,format之后在git里看到的变更会有多处(因为修复了格式)的情况。这样导致code review工作量巨大
    共 1 条评论
    5
  • Jackey
    2020-01-15
    总的来说还是整齐最重要,一个团队就像一个人。大家都严格按照规范来写,再辅之以自动化检查工具,代码质量还是可以有保证的。就怕为“某段代码”破例,一破例就容易“决堤”😂
    4
  • 游魂客
    2020-07-24
    PHP近些年 开源框架还是 开源项目基本都是遵循 PHP FIG 组织制定的 PSR 规范. 风格基本统一了 PSR-2 规则 代码必须遵守 PSR-1。 代码必须使用4个空格来进行缩进,而不是用制表符。 一行代码的长度不建议有硬限制;软限制必须为120个字符,建议每行代码80个字符或者更少。 在命名空间(namespace)的声明下面必须有一行空行,并且在导入(use)的声明下面也必须有一行空行。 类(class)的左花括号必须放到其声明下面自成一行,右花括号则必须放到类主体下面自成一行。 方法(method)的左花括号必须放到其声明下面自成一行,右花括号则必须放到方法主体的下一行。 所有的属性(property)和方法(method) 必须有可见性声明;抽象(abstract)和终结(final)声明必须在可见性声明之前;而静态(static)声明必须在可见性声明之后。 在控制结构关键字的后面必须有一个空格;而方法(method)和函数(function)的关键字的后面不可有空格。 控制结构的左花括号必须跟其放在同一行,右花括号必须放在该控制结构代码主体的下一行。 控制结构的左括号之后不可有空格,右括号之前也不可有空格。
    展开
    3
  • 小可
    2020-01-15
    既然是规范,就不是为了表达个性化的代码风格。花括号同行还是换行,缩进两格还是四格,现实当中没有绝对的标准,只要在公司或部门内统一就行,即使换了地方,标准不一样只要统一,适应几天就好了。不然每次更新代码,都要格式化,提交后连上次修改的地方都找不出来,因为diff出来全变了😂
    3
  • 李小四
    2020-01-15
    设计模式_32 缩进这个我要看一下了,因为一直都用tab缩进,可能是团队中都习惯tab缩进(并没有规定),所以没遇见过问题。 有的时候,代码风格没有优劣,统一的风格就像统一度量衡,光是统一就带来错误率降低和效率提升。
    展开
    3
  • Graham
    2021-04-16
    类文件要多大,反正不要超过200 行。 至于代码风格,可以直接用那个google style 去format 一下。
    2
  • Aaron 延亮
    2020-08-04
    我感觉改善代码建议这块可以罗列一些开发手册 尤其是多个语言的不同手册 比如谷歌的java开发手册,华为的c++开发代码规范,阿里出的java开发手册等
    2
  • 程序员小跃
    2020-01-19
    在IDE工具里,项目组分享一份模板,把注释、代码缩进等都统一起来,真的是一件很棒的事情。
    2
  • xavier
    2020-01-15
    主要使用 C 语言,大括号另起一行。大括号跟在语句后面的,看起来感觉不够直观。其实还是习惯问题。看多了就习惯了。至于 Table 缩进,在一些 IDE 中,虽然输入是 Table 键,但实际上是被替换成了两个或四个空格。
    2
  • qinsi
    2020-01-15
    斐波那契缩进结合代码行长度限制可有效避免嵌套过深 (手动滑稽
    2
  • javaadu
    2020-01-23
    我基本就按照阿里巴巴的编码规范来,在此之外才会“自由”发挥,不过这部分也会尽量做到项目内部统一
    1
  • 守拙
    2020-01-15
    补充一点: <Google Java Style Guide>中明确要求: Tab不能用于缩进. 原文: 2.3.1 Whitespace characters 2. Tab characters are not used for indentation. 从今日起,改掉坏习惯,不再使用tab缩进.
    展开
    共 1 条评论
    1
  • Monday
    2020-01-15
    简单易懂,都见过,没引起重视
    1