今天这篇文章出自前端大牛 Lea Verou。
如果你在 Twitter 上关注了我或者你曾听过我的演讲,或许就知道我是极力鄙视用空格来进行代码缩进的。但是我从没在舞台上详细解释过我这个观点,而 Twitter 又不适合用来阐述技术观点,所以我一直都想写篇博文来表明我在这个老生常谈的问题上面的看法,这就是写此文章的原因。
Tab 占用更少的空间
使用 Tab 的文件或许和不使用 Tab 的在 gzip 压缩后并没有明显的区别。但是不使用 Tab 的话,就得多一道程序处理你的代码,以保证文件大小合理。你不得不依赖压缩工具。拿注释举例来说,注释很有用,即使无法压缩代码也要有注释。Tab 可以达到和空格同样的效果,所以不用 Tab 的话,平白无故就会膨胀代码。
Tab 可个性化
每个编辑器都可以调整 Tab 字符的宽度。这通常被认为是 Tab 的缺陷,但是实际上,这正是 Tab 的优势所在。有了 Tab,别人就能以自己觉得方便的格式查看你的代码,而不是用你喜欢的格式。Tab 将代码表现从逻辑中分离出来,就像是 CSS 将页面表现从 HTML 中分离出来一样。Tab 使读者更方便,而不是让编写者掌控一切。用空格就像是在说:“我不管你读代码时方不方便,这是我的代码,你就得按照我的方式来”。
Tab 更利于合作
每个程序员都有自己不同的想法,在团队合作中这种个性更要重视。有的程序员喜欢缩进 2 个空格宽,有的喜欢缩进 4 个空格宽。使用 Tab,每个程序员可以用自己喜欢的缩进方式编写代码,编辑器会根据所设置的 Tab 宽度自动调整缩进,而不必手动调整或者机械地在pull之后改成自己的缩进风格,而在提交前又改回统一的风格。
不需依赖特定工具
使用空格时,缩进实际上是 N 个字符而不是一个,只不过编辑器展现出来的看起来像是一个字符而已。而使用 Tab,你每次按下 Tab 键,编辑器会插入 N 个空格;每次按回退键或是在缩进处删除字符时,编辑器会自动删除 N 个字符。当你不能用编辑器,而被迫使用其它工具时(例如当在嵌入了像是 codemirror 等工具的 webapp 中写一小段代码时),你会被空格丑哭的。尤其是 codemirror 会将 Tab 转换为空格,别人看你的代码时也会被丑哭。
Tab 易于选择
假设你要选中所有缩进,想把缩进加倍或是将它们换成空格的话,用 Tab 就很容易操作。因为这是正它的意义所在,Tab 就是为了这类情况发明的。而空格的意义就多了,所以你无法简单的查找、替换空格。这种并不是为了发挥某种工具的原本功能而使用它的行为,我们通常称之为 hack。使用空格来进行缩进就是一种 hack。
使用 Tab 缩进的代码更易于复制粘贴
Norbert Süle 在评论中 指出,复制粘贴用空格缩进的代码时,除非别人惯用的缩进宽度恰好和你的一样,否则你就得手动调整缩进。使用 Tab 就不会出现这种问题,因为 Tab 就是 Tab,它会和代码完美的融合在一起。每个人都使用 Tab 的话,世界都会更加美好。
Web 中的 Tab 更宽怎么办!
这是个严重的问题,即使是钟情 Tab 的优秀程序员在上传代码前也会将 Tab 转换成空格。但是,CSS3 的 tab-size 属性 解决了这个问题。目前 Opera、Firefox 支持此属性,Webkit 很快也会支持。这个属性可优雅降级:即使浏览器不支持,呈现出来的代码虽然没有那么美观,但是仍具有良好的可读性。
空格一定不好吗?
空格是对齐的最佳选择,而不是缩进。比如下面这段代码:
var x = 10,
y = 0;
你需要 4 个空格使变量对齐。如果使用 Tab 的话,只有在 Tab 宽度为 4 的时候,变量才会对齐,否则格式就会乱掉。但是如果这段代码是缩进的,仍然应该用 Tab 而非空格。
另一个例子是对齐具有不同厂商前缀的 CSS3 属性。缩进应该使用 Tab,但是对齐应该使用空格。示例如下:
div {
-webkit-transition: 1s;
-moz-transition: 1s;
-ms-transition: 1s;
-o-transition: 1s;
transition: 1s;
}
认真你就输了
好吧,我夸大了空格的缺点。我确实认为空格很糟糕,但是我得承认比起程序员使用空格缩进,其它的问题可能更加严重,比如,程序员不恰当地给变量命名,或是比起 Vim,更喜欢 Emacs。