因为缩进风格不同,两个程序员分手了~

2023-10-28 10:37:22 浏览数 (1)

在HBO的喜剧片《硅谷》第三季中,不同的缩进风格导致了两位程序员分手。在现实编程中,缩进时使用空格键还是Tab键,也不是一个小问题。

制表符与空格之争

Google程序员Felipe Hoffa 分析了GitHub上的40万个代码库,10亿个文件,总共14TB数据,这些文件不包含重复的文件和代码行数低于10行的文件,分析后发现空格键远比Tab键流行。

之所以关注这个问题,是因为从Java语言转到了Go语言。看上面的图,你会发现,在Java语言中,甚至大多数语言中,以空格键缩进比Tab键流行太多了。但唯独Go语言特立独行,以空格缩进的使用几乎为零。Why?它为什么这么特立独行?

制表符缩进风格

在大多数的Java代码规范中都会建议使用4个空格来代替Tab(制表符)。Tab其实是占8个字符,因此我们可以使用4个空格(4个字符)来代替Tab,这样既减少了代码的存储大小,也提供了一种美观的代码。

Four spaces should be used as the unit of indentation. The exact construction of the indentation(spaces vs. tabs) is unspecified. Tabs must be set exactly every 8 spaces(not 4).

实现这一功能,通常可修改Eclipse或IDEA等IDE的设置,这样当格式化代码时就会显示统一的代码风格。

在Python中,缩进代表着代码的层级结构,对缩进有更严格的要求,但依旧是通过4个空格来进行代码缩进。其实Python并没有强制要求用Tab缩进或者用空格缩进,但Python中的空格和Tab键不能混用,否则会直接报错。

为什么推荐空格键缩进

一般情况下,团队开发都要制定一套编码规范,在大部分团队中,都使用4个空格代替Tab。各个IDE也都提供了Tab自动转换空格的功能,可以轻松设置使用。

那么,使用4个空格代替Tab有什么好处呢?

Tab在ASCII码中,编码是9,而空格是32。当我们按下一个Tab的时候,即使它看起来就是8个空格(或者4个空格,不同的环境下,Tab可能显示的效果不同),对于电脑来说,却是完全不一样的东西。这也意味着,对于用字符来描述过程的代码来说,极有可能会是决定性的差异。

换一种说法,Tab缩进可以理解为一个特殊的字符,而这个特殊的字符在不同的环境或编辑器里,长度可能不一样。在一个编辑器里用Tab设置缩进后,在其它编辑器里看可能缩进就乱了。

而空格就是空格,就占一个字符的位置,不会因为编码不一样或者IDE不一样而有差异。从而保证团队成员的环境一致,是减少问题的很重要的手段。

特别是对于一些细致排版缩进来说(比如说想把每一行的注释都对齐),用空格也更加精确,在各种情况下代码都是你想要的样子。而Tab仅仅当你与代码作者的Tab尺寸设定为相同时,代码才好看。

Go为什么特例独行?

Go提供了统一的格式化工具——gofmt,当开发者保存代码时,它会自动将代码进行格式化,而且所有的人都采用统一的标准。这也是Go的伟大创举之一。

但在gofmt的文档中,我们可以看到如下一段描述:

Gofmt formats Go programs. It uses tabs for indentation and blanks for alignment. Alignment assumes that an editor is using a fixed-width font.

也就是说:Go使用制表符进行缩进,使用空格进行对齐。对齐假定编辑器使用的是固定宽度字体。官方也明确说明,除非有特殊需求,推荐使用制表符(Tab)来进行缩进。

为什么如此选择呢?相对官方的一种解释是:

一个制表符在不同的环境中可能代表不同数量的列,但空格始终是一个列。在缩进方面,使用多少个空格(或制表符)并不重要,重要的是在代码中保持一致。

当然,一致性比任何一个都更重要,一个好的集成开发环境(IDE)使得这些差异变得微不足道。话虽如此,这个讨论的重点是引发一场圣战,所以:

  • 制表符是专门用于缩进的字符。
  • 它们允许有不同缩进大小偏好的开发者在不改变代码的情况下改变代码的外观(数据与展示的分离,俗话说的赢!)。
  • 使用制表符缩进是不可能出现半缩进的情况。当你从一个使用3个空格的网站复制代码到4个空格缩进的文件时,不必处理错位问题。

从Go官方来说,考虑的基本初衷是:缩进应该有多宽?2个空格?4个?8个?还是其他?通过将缩进设为制表符,你可以决定这个问题的答案,每个人都可以根据自己的喜好来查看代码的缩进宽度。简而言之,这就是制表符的作用。

至此,是不是发现一个非常有意思的问题。一种形式的缺点,在另外一个视角来看,却又是优点。虽然它们是相同的客观存在,仅仅是因为看待者的视角不一样而已。

最后,再次强调,在Go中,只有在必须的情况下才使用空格,使用制表符进行缩进是官方推荐。这也是为什么上面的统计中,Go基本上全部都使用制表符来进行缩进了。

0 人点赞