2013-10-08

用TAB缩进, 用SPACE对齐

Views: 19764 | 24 Comments

TAB vs SPACE 是一个争论不休的话题. 不过, 对于大部分编程语言, 混用 TAB 和 SPACE(空格) 缩进也可以正常工作, 除非你用的是语法非常傻逼的语言如 Python(仅仅是语法傻逼, Python 的对象模型和库还是很有用的, 大家可以试试 Cpy 编程语言 - 用 C 语言语法写 Python 代码).

首先, 我遇到的大部分项目和大部分程序员, 都将 TAB 设置为 4 个字符的宽度, 所以对于缩进来说, 用 TAB 还是 SPACE, 显示效果都是一样的. 当然, 对于使用了所按即所得的编辑器的人, 删除 4 个空格要按 4 次键盘, 确实很烦人.

不过, Google 的编程风格是用 2 个空格来缩进, 我比较感兴趣 Google 的工程师是敲两次空格键来缩进, 还是设置了按键精灵, 自动把 TAB 输入转成两个空格. 反正, 用 2 个空格还是用 4 个空格, 由他们去争论吧. 如果用了 TAB, 至少没有数量上的争论, 没人会愚蠢到用多于两个 TAB 来表示一级缩进.

其实, 用 SPACE 的主要目的, 是为了让代码在竖直空间上对齐(列对齐), 包括注释和赋值, 如:

a   = 1;   // 1
abc = 200; // 2
aa  = 3;   // 3

但是, 这不是在缩进, 而是在对齐, 所以在这个地方讨论 TAB vs SPACE 是没有意义! 什么是缩进? 显然缩进是对于行首来说的. 对于缩进来说, 还有什么理论反对 TAB? 难道你怕麻烦不想按 4 下空格键? 还是你的文本编辑器不够智能到自动区分缩进和对齐?

如果你用 4 个空格, 哪天要拷贝 Google 的 2 个空格的代码, 不是很烦人吗? 如果 Google 也用 TAB 来缩进不是很好吗?

所以, 用TAB缩进, 用SPACE对齐.

Related posts:

  1. 用C语法来写Python代码
  2. Cpy是如何打败Python的
  3. 开始学习 Python
  4. Google Talk Developer Home 中文翻译
  5. SSDB – 支持 zset 的 LevelDB 服务器
Posted by ideawu at 2013-10-08 23:48:46

24 Responses to "用TAB缩进, 用SPACE对齐"

  • @ideawu: 咦?评论只能缩进到6级,然后就没有Reply按钮了啊……(纯题外话)
    嘛,不要强迫其他人看的自己喜欢而别人不一定喜好的的东西……真实好论点,去和制定规范的家伙说去嘛……

    不过我仍然喜欢空格,原因?
    除了我之前说过的固定外,我发现你纠结在击键次数上……现代的编辑器上,用空格和用tab缩进,都是按下一个tab解决的事情。

    嘛,到最后,这个话题也是和诸多的程序员中经久不衰的话题一样啊……随便你了,-异教徒-(试试看支不支持删除线……) Reply
    @doyle: 你是我在Google编码规范之外见到的唯一一个活的用2个空格缩进的程序员… 期待以后认识更多的用 1,3,5,6,7,9,10,… 个空格表示一级缩进的朋友! Reply
    @ideawu:
    客气了,我不是那么珍惜的动物……我一直是用一次击键(tab)得到4个space缩进的普通程序员……(之前的回复中都只是说明一下,不论编码规范怎么改,要让行首从n个空格变成m个空格都是很容易的……)

    如果有幸我的工作需要用到google贡献的开源代码,我会根据其开原协议,做一些不同的处理,
    比如:GPL系列的,以及大多数情况下,我就原封不动,让他们依然是两个,反正又不是我的代码。

    更宽松的,比如mit,且确实有必要的情况下,写个sed把行首处理一下,分分钟的事情
    但是我一定会因为懒,而决定继续让这些代码使用2空格缩进…… Reply
    @doyle: 每拿到一份别人的代码, 就要进行文本处理, 可能自己方便了, 但再把代码返回给别人时, 别人不一定会进行相逆的文本处理.

    我的原则是, 简洁. 用较少的工具, 做较少的配置. 这样, 当你需要同时在几十台服务器上工作时, 直接上手. Reply
    @ideawu: 我是野生程序员,我不在it行业工作(我们是电子原器件封装),我们的程序员最多的时候加起来也只有3个,我们写过的最大的程序的代码量……不好意思,我没数过,但是目测应该不到一万吧……(实际上有个项目其中一个被命名为common的文件包含近8千行代码,但第一,那个是外包的,不算,第二,那个是在我进来之前就有的,不算,第三,我已经给他瘦身了(我想自夸一下))

    所以对于你说的那种更多的人,更多的设备,更大的代码量的情况,我没有经验。

    但即使没经验,我觉得,参与这种合作,首先得服从规矩的制定者,它说要用tab,我就绝对就不用space。

    而这类问题,显然如果参与的人数足够多,即使制定者一开始没有规定,逐渐的也会成为项目的风格固定下来,后来参与者,也只有接受的份,也是不能自说自话的,那么该用tab还是space也是唯一确定的。

    所以,我觉得我们之前的讨论应该都只针对小的甚至是个人的项目。 Reply
    然后我就可以和大家说
    哈哈哈,我的代码写的很烂的,你看,那些精妙的部分,都是2个空格缩进的吧,那些都是我从开源项目里拿来的,那些4空格缩进的才是我写的……哈哈哈

    等等,不要误会我会在同一个文件里混用2空格和4空格,那样会执行出错的……(python……)

    想起来,go fmt好像会自己处理一下……我要去数数它到底把我的代码变成几个空格了…… Reply
  • 我倒觉得,正是因为不同编辑器可以把tab解释成各种宽度,才导致大家逐渐更喜欢(事实上)使用space……也即,同样的代码,这边显示两个字符空格,那边显示4个字符空格,才是更让人受不了的。
    而自动的把行首4个space替换成2个,有各种方法可以一次性的解决。 Reply
    @doyle: 无论行首的TAB显示为几个字符宽度, 它仍然是缩进的. 所以, 将行首的TAB转成空格是画蛇添足的做法, 而且解决不了Google的问题. Reply
    @ideawu:
    首先,我没有说过要将行首的tab转换成空格,我是一开始就用空格的。

    然后,我说的不是要不要缩进,我说的是视觉上,用tab缩进,这个编辑器显示4个字符宽度,那个编辑器显示2个字符的宽度,会很奇怪。

    其次,我说的是,用空格来缩进,可以得到的好处是:1.缩进(tab也有),2.视觉上的固定(我说是2个,就绝对不会是4个,tab不能保证)

    最后,如果将来编码规范变了,只要替换行首的空格数量就行
    嘛,最后这一点,对于使用tab来说就是只要修改编辑器对tab解释的宽度就行……但是,谁能强制程序员的编辑器对tab如何解释呢


    以及,只要公司的vcs支持,写个插件(比如git的hooks),在代码提交的时候自动按照行首空格要求对提交的代码处理一下,4空格还是2空格的问题就解决了。 Reply
    @doyle: 正因为不用强制程序员的编辑器对TAB宽度的解释, 所以用TAB进行缩进完全没有问题. 所以, 这个事实是支持TAB缩进的. 如果能看到不同程序员对"缩进宽度"有不同理解的事实, 就不应该使用SPACE来缩进. Reply
    @ideawu: 问题不就在于,我这边看起来是2个空格宽度,你那边看起来是4个甚至8个宽度嘛?为何这个就不是问题呢? Reply
    @doyle: 这恰恰不是问题, 因为2个"字符(包括空格)"宽度是你看, 4个p字符宽度是我看. 程序员从来不喜欢用别人的开发环境, 所以你不必关心别人的环境, 所以, 这不是问题. 而且, 你也不应该强迫自己让别人看到你喜欢看的东西.
    @doyle: 你用两个空格表示一级缩进, 不错. 请问你按两次空格键吗? 请把TAB键抠掉. 还有, 你用2个空格, 要是在Google, 不错, 要是在别的公司, 你完蛋了… Reply
    @ideawu:
    “你用两个空格表示一级缩进, 不错. 请问你按两次空格键吗? 请把TAB键抠掉. ”
    你是一只在用notepad写么?不论是notepad++,sublime text,vim,emacs,都支持你按下tab建,自动用你自定义的n个空格替换的好嘛……

    “还有, 你用2个空格, 要是在Google, 不错, 要是在别的公司, 你完蛋了…”
    理由同上,我完全看不到我为何会完蛋啊……甚至,是在不行,写一段sed很难么? Reply
    呃……不能编辑?
    发现自己变成啰嗦的老太了,好像写了很多,其实都是一样的内容在重复……抱歉啊。 Reply
  • 全部用空格,找个顺手强大的编辑器和IDE帮你搞定自动缩进、TAB转换空格、一次性删除缩进空格 Reply
    @jacky: 看了你这评论
    才想起作者除了说用tab缩进(我不喜欢)之外,还说了用空格对齐啊……
    对齐这活我从来不做……所以我的回复里都把这个给忽略掉了……
    但是我想想了一下,用空格对齐,确实仍然比tab对齐好,不会被编辑器的解释而动掉。

    所以怎么想都仍然是一致的用空格(行首的缩进,和语句中的对齐)
    何况如@jacky所说,有那么多“强大的”编辑器可用。 Reply
    @doyle: 事实上, 我的代码不刻意进行列对齐, 只强制做行首对齐(也即缩进). Reply
  • 我觉得刚好相反,Space缩进,TAB对齐。

    自己感觉,调整缩进有工具,但是调整对齐没有。所以对齐还是TAB好
    缩进的话,不同的编辑器对TAB的解析太不一样了(特别是行首的),还是空格好

    PS:对齐是TAB的标准用途啊(不用去算几个空格,多行自动对齐)! Reply
    @boinjj: 如果用TAB来对齐, 遇到TAB宽度设置不一样的, 对齐就乱了. 如果是用TAB来缩进, 无论编辑器将TAB解析了多少个字符宽度, 缩进都是正常的, 还可以根据视觉看好调整宽度, 所以应该用TAB. 如果用空格来缩进, 遇到Google那样要求两个字符宽度的, 重新格式化后, diff就没法看了. Reply
    @ideawu: diff没法看,用difftool呗…… Reply
    @doyle: 不能强制程序员换工具… Reply
    @ideawu: 不能让程序员自己换工具的公司还是早点去死吧(纯个人喜好问题) Reply
    不对,我上条回复错了,不是与允许换,是不能强制换哦
    那么就是,不去接受,不去学习事实上更好的工具,是程序员的罪过

    有那么多可以忽略行首,行尾空格的比较工具不用,自己拖累自己的工作效率,怪谁呢。

Leave a Comment