标签“可以在不同类型的系统和编辑器上完全不同地显示”?

时间:2014-12-04 17:26:49

标签: coding-style whitespace indentation spaces tabstop

在阅读反对使用Tabs的论点时,我遇到了这个(source):

  

...完全避免使用标签是一个好主意,因为计算机世界中标签的语义不是很明确,并且它们可以以完全不同的方式显示在不同类型的系统和编辑器上

我对编程比较陌生,从来没有在我的代码中遇到任何标签问题,我使用过许多编辑器,包括Notepad ++,Programmer的Nodepad,Gedit,Kate,Sublime Text等。我可能没有做了足够的编码来达到这一点,因此问题是:

有人可以用简单的语言解释一下引用的内容吗?标签的问题是否仍然相关?


请注意,我不是在问我是否应该在代码中使用制表符或空格。我只是在对我遇到的标签的特定论点进行了合理的解释之后。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

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

缩进

让我们说有人在他们的编辑器中使用制表符宽度: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.

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

问题#2:Tab与所有地方不一样

这是因为选项卡的“语义不是很明确的”部分。

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

但是在某些情况下,制表符可能会用于某些不同的东西。例如,在单词处理器中,选项卡表示“移动到下一个制表符停止”,其中制表位完全是任意的(并且很可能不是相同宽度的事件)。

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

Document with tab stops

现在让我们说他们需要在其中粘贴一些代码段。如果代码使用制表符,则会发生以下情况:

Code in document with arbitrary tab stops

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

结论

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

空间没有上述问题。

答案 1 :(得分:1)

我喜欢@Giedrius的回答(+1),而且我会因为过去简单地过度简化历史。

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

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

跳过几百个听到,可能是我不知道的相关事情。

打字机(嘿小孩,实际上看过一个?)这些允许你打出你想要的任何东西。然而,为了使其工作(完全机械,所有齿轮和滑轮,不需要电力,但对于蒸汽朋克不够冷却)每个角色必须具有相同的宽度,包括空间。

自由格式的单词一切都很好,但很多时候人们都希望在格式很好的列中输入数字 - 例如发票,您可以在其中列出项目,然后按小数点排列成本,总计为底部。 (你能想象用手工做吗?恭喜你,你只是想象我的夏季工作回来的时候。&lt;&lt;在这里插入液体纸参考。&gt;&gt;)为了使这个可行,有人想出了TAB键。如果你在打字机上做X,它会记住“嘿,这里有一个标签停止”,如果你点击标签并且还没有到达你输入打印头的行上的那一列就会跳到那一点。它有多大?你猜对了,它取决于用户需要什么。 (什么&#34; X&#34;完全取决于打字机制造商。)

因此如此:标签和空格之间没有现实世界的相关性,除非来自同义词行业的东西模糊不清。在打字机上,制表位会与“常规”字符位置对齐,而在计算机上则没有这样的限制。