为什么许多程序员将逗号移到下一行?

Val*_*sin 16 javascript

请告诉我,下面这种风格的神圣力量是什么:

var javascript = new Language(
  'Brendan Eich'
, new Date(1995, 0, 1)
, ['C', 'Java', 'Scheme']
);
Run Code Online (Sandbox Code Playgroud)

为什么许多程序员使用这种风格?它有什么好处?例如,

var javascript = new Language(
  'Brendan Eich',
  new Date(1995, 0, 1),
  ['C', 'Java', 'Scheme']
);
Run Code Online (Sandbox Code Playgroud)

我比以前更喜欢.谢谢.

YoY*_*nnY 14

已经有很多很棒的答案了.请允许我给你自己的,尽可能清楚.

我个人称之为编写代码'Haskel style'的方式,因为它是在Haskell中使用的常见样式.让我先给你一个Haskell示例:

data Settings = -- The user settings
    { has_sound     :: Bool   -- Determines if the user has sound
    , has_power     :: Bool   -- Determines if the user has electricity
    , has_graphics  :: Bool   -- Determines if the user has graphics
    , user_name     :: String -- The name of the user
    , user_password :: String -- The hashed password of the user
    , user_email    :: Email  -- The email address of the user
    , stylesheet    :: Style  -- The stylesheet to use
    }
Run Code Online (Sandbox Code Playgroud)

以及我的一个项目的Javascript代码段:

var events // Holds the events to generate a event handler for.
  , var2   // Quick description for var2.
  , var3   // Quick description for var3.
  , ...    // ...
  ;
events = // Event handlers will be generated for the following events:
    [ "onmousedown"  // Works outside of the window element
    , "onmouseup"    // Works outside of the window element
    , "onmousemove"  // Works outside of the window element
    , "onmousewheel" // This will handle DOMMouseScroll aswell
    ];
Run Code Online (Sandbox Code Playgroud)

'Haskell风格'的好处

易于阅读

'Haskell style'利用了列样式布局.此列样式使您的代码更具可读性.实际上,它使您的代码更具可读性,因此您始终可以使用它.想象一下编写没有标签或前导空格的代码!

通过利用列样式布局,变量名称,类型等也更容易阅读.通过按前缀对变量进行分组,我们未来的读者可以轻松找到他要查找的内容,而无需使用高级搜索查询.

易于记录

列样式布局具有更多优点.通过对我们的代码进行分组,我们可以添加一个为注释保留的列.现在您可以在不需要颜色突出显示的情况下阅读代码,并且在评论中添加信息就像找到正确的列并进行修改一样简单.此外,这种类似列的样式记录您的代码几乎是您使用像Doxygen这样的文档生成器后得到的,消除了这种工具的必要性.

容易发现错误

注意到缺少逗号是使用这种编码风格的小菜一碟.只需寻找一条不以它开头的线!另一方面,我们在行尾有逗号.我们错过了一个?不,因为它是最后一个元素,或者因为表达式在下一行继续.找到列表中的第一个元素就像是一样容易.当用长线条处理,第一个元素很容易被忽略,但通过将第一个元素在它自己的线和puting一个[{代替,在它的右前方,很容易被发现.

易于扩展

您可能会说"但是一旦表达式变大,这种布局样式将无法处理!",这是完全正确的,但这对于其余代码有什么不同吗?我认为通过使用列样式,您至少可以保持代码的可读性,从长远来看,这比您可能需要将其适合列布局更有价值.

一个例子!

var scalable = // This is a example variable
    [
        [ new MyObject // This is how I would style Object Allocation
              ( "11"
              , "This is the first element"
              , function // This is a very secret function...
                  ( secret   // ..with secret..
                  , variable // ..variable..
                  , names    // ..names!
                  )
                {
                    // <-- Use spaces, not tabs :)
                }
              )
        , "12"
        ]
    ,
        [ { id:   21                          // Where's 20?
          , name: "This is the third element" // It sure is
          , func: function() { /* My body feels empty :c */ }
          }
        , "22" // Notice how 21 is a integer, not a string. Sneaky!
        ]
    ];
Run Code Online (Sandbox Code Playgroud)

TL; DR

这种放置逗号'Haskell风格'的风格有几个优点:

  • 易于阅读
  • 易于记录
  • 容易发现错误
  • 易于扩展

  • 那些逗号看起来像地上的烟头 (4认同)
  • 您可以使用列间距而不使用逗号,使得前导或尾随同样容易记录/注释.而且我不同意"更容易阅读",无论有多少Haskellers说,因为它需要在线路上的第一个有价值的东西之前有"噪音",这意味着你需要训练你的大脑"隐藏"噪音当扫描代码时,你的大脑总是需要处理它......"最后丢失的逗号"是一件非常重要的事情,可以发现和修复扫描的清洁度和易用性似乎是值得的. (3认同)

Koe*_*ers 12

这是因为逗号属于新行下一个语句而不是前一个语句.(正如@Dave Newton在下面的评论中所述:伪BNF将是foo [,foo]* - ish)

例如:

如果你有这个:

a,
b,
c
Run Code Online (Sandbox Code Playgroud)

如果你需要删除c那么你需要删除两件事:de c和前一行的逗号.如果你这样做:

a
,b
,c
Run Code Online (Sandbox Code Playgroud)

现在你只需要删除c行.这种方式更有意义,因为b第一个例子背后的逗号只是需要因为c.尽管如此,它确实看起来更糟.这是代码的可维护性和外观之间的权衡.

  • @koenp:现在,如果删除`a`行,则会出现问题.(您不仅需要删除该行,还要删除它后面的逗号.)您没有减少问题的数量,只是将它们拖垮了. (19认同)
  • 除了您的个人观点之外,还有其他论点吗? (2认同)
  • @mata Syntatically,伪BNF将是`foo [,foo]*`-ish.我认为这个论点是逗号与以下语句相关联,而不是最初的语句.这并没有涉及"新线"的事情,但IMO逗号与跟随`foo`s更紧密地联系在一起. (2认同)

Mar*_*nze 12

如果你在最后一行的末尾一个额外的逗号,它将在某些浏览器中运行,但不适用于所有浏览器.使错误比开头的额外逗号更难检测(在所有浏览器上都失败).大多数开发人员更喜欢立即看到错误(因此他们可以修复它),而不是冒着生产问题而无意中不支持某些浏览器.特别是如果解决方案就像删除逗号一样简单.

另外,在行的开头加上逗号,可以更简单地在末尾添加一行,并且您需要触摸该行(您不需要在行之前添加逗号).如果您使用版本控制(例如diff,annotate,bisect),这一点很重要.有人可以争辩说,在数组或对象的开头添加一行将需要触摸2行的相同额外工作(如果你在开头使用逗号),但根据我的经验,在开头插入一行不太可能在末尾插入一行.

  • 如果你在第一行**的开头有一个额外的逗号**,​​它将在几乎所有*浏览器中失败.只是说. (9认同)

tim*_*ood 9

我认为这样做可以更容易发现错过的逗号.

var something = 0,
    foo = "a string",
    somethingElse = []
    bar;

var something = 0
  , foo = "a string"
    somethingElse = []
  , bar;
Run Code Online (Sandbox Code Playgroud)