4

While reading arguments against the use of Tabs, I came across this (source):

...it can be a good idea to avoid tabs alltogether, because the semantics of tabs are not very well-defined in the computer world, and they can be displayed completely differently on different types of systems and editors.

I am relatively new to programming, and have never experienced any issues with tabs in my code, and I've used a number of editors including Notepad++, Programmer's Nodepad, Gedit, Kate, Sublime Text, etc. I may not have done enough coding to get to that point, hence the question:

Can someone please explain, in simple terms, what the quote states? And is the problem with tabs still relevant?


Please note that I am not asking you whether I should use tabs or spaces in my code. I am only after a rational explanation for a specific argument against tabs that I've come across.

4

2 回答 2

7

我假设你想看一些例子,所以下面我列出了一些最常见的例子。

问题 #1:标签宽度不一致

这是针对“在不同类型的系统和编辑器上显示完全不同”的部分。

即使假设所有系统和编辑器(将显示您的代码)都同意相同的选项卡语义:“向右移动直到当前列是 N 的倍数”,N 是任意的。

历史上这个 N 的“标准”是 8,但现在大多数人将他们的编辑器配置为 4 或 2 以“看起来更好”。

这就是标签宽度不一致问题的来源。

我将在示例中使用制表符宽度 2 和 8 以使差异更加直观,但同样适用于其他宽度。

缩进

假设有人在他们的编辑器中使用 tab width: 2 。他们看到这样的代码:

class Foo:
  def doSomething(a):
    if test(a):
      // some nice comment
      // about this
      bar(a)

现在其他人在使用制表符宽度 8 的终端中读取此代码。他们看到的代码如下:

class Foo:
        def doSomething(a):
                if test(a):
                        // some nice comment
                        // about this
                        bar(a)

有人可能会认为这不是很愉快。

对齐

到目前为止,我们已经看到缩进不一致。但有些人也喜欢对齐代码,例如分配、注释。

再次使用标签宽度 2:

class Foo:
  def do_something(a):
    if test(a):
      foo     = a.foo     // some nice comment
      foo_bar = bar(foo)  // about this
      bar(a)

再次有人在选项卡宽度为 8 的环境中阅读此内容。假设他们需要将此片段发布到网络并使用<pre>标签。浏览器默认使用“标准”标签宽度 8,代码如下所示:

class Foo:
        def do_something(a):
                if test(a):
                        foo                     = a.foo                 // some nice comment
                        foo_bar = bar(foo)      // about this
                        bar(a)

他们不能按原样发布。他们必须修改代码以将制表符替换为空格。

线长

大多数编码标准都定义了最大线宽。

让我们以最大线宽 80 为例。

使用制表符宽度 2 的人可能会看到此代码完全符合标准。对于他们来说,最长的线宽是 74(可见宽度,而不是 72 字节的线长)。

class Foo:
  def do_something(a):
    // Some very nice comment about code bellow using more then few words.

使用制表符宽度 8 的其他人(例如在终端中)将看到与不合格相同的行,因为现在最长的行宽是 86:

class Foo:
        def do_something(a):
                // Some very nice comment about code bellow using more then few words.

由于标签宽度不一致,因此 line with 现在也不一致。

问题 #2:Tab 在任何地方都不一样

这是针对“标签的语义不是很明确”的部分。

到目前为止,我们假设每个人都使用制表符作为“向右移动,直到当前列是 N 的倍数”。

但在某些情况下,制表符可能用于一些不同的东西。例如,在文字处理器中,tab 表示“移动到下一个制表位”,其中制表位是完全任意的(并且很可能不会出现相同的宽度)。

例如,假设某人正在编写使用制表位的文档:

带有制表位的文档

现在假设他们需要在其中粘贴一些代码片段。如果代码正在使用选项卡,则会发生以下情况:

带有任意制表位的文档中的代码

他们不能让它保持原样。他们必须修改代码以将制表符替换为空格。

结论

如您所见,不同上下文中的选项卡可能会使代码从轻微到完全不可读。

空间没有上述问题。

于 2014-12-11T14:18:52.337 回答
1

我喜欢@Giedrius 的回答(+1),并且正因为如此,我将抛开一些过于简化的历史。

什么是空间?它是用于识别单词的字母之间的空白段。

空间有多大?这取决于字母——特别是字体。有数千种字体,它们都可以标记为比例或非比例。在比例字体中,字符宽度不同(比较 i 和 M);在非比例字体中,字符宽度始终相同 ( compare i and M)。空间有多大?它与设计字体的人确定的大小一样大。(排版自古腾堡以来就已经存在,这意味着排版行业已经有几个世纪的时间来确定哪些有效,哪些无效。)

跳过几百次听到,可能发生了我不知道的相关事情。

随之而来的是打字机(嘿孩子们,你真的见过吗?)这些让你可以输入任何你想要的东西。然而,为了让它工作(完全机械,所有齿轮和滑轮,不需要电力,但对蒸汽朋克来说还不够酷),每个角色都必须具有相同的宽度,包括空格。

自由形式的单词都很好,但人们经常希望在格式良好的列中输入数字——例如发票,您列出项目后跟它们的成本,按小数点排列,底部有总数。(你能想象用手来做吗?恭喜,你想象我的暑期工作早在什么时候。<< 在此处插入液体纸参考。>>)为了使这可行,有人想出了 TAB 键。如果您在打字机上按 X,它会记住“嘿,这里有一个制表位”,如果您按下制表位但尚未到达您正在打字的行上的那一列,打印头会跳转到该点。有多大?你猜对了,这取决于用户需要什么。(什么“X”完全取决于打字机制造商。)

如此等等:制表符和空格之间没有现实世界的相关性,除非行字行业有一些晦涩难懂的东西。在打字机上,制表位将与“常规”字符位置对齐,而在计算机上则没有这样的限制。

于 2014-12-11T22:41:38.747 回答