22

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

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

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

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

我比以前更喜欢。谢谢。

4

9 回答 9

16

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

我个人将这种编写代码的方式称为“Haskell 风格”,因为它是在 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
    }

还有我的一个项目的 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
    ];

“Haskell 风格”的好处

易于阅读

“Haskell 样式”利用了列样式布局。这种列样式使您的代码更具可读性。事实上,它使您的代码更具可读性,以至于您一直都在使用它。想象一下编写没有制表符或前导空格的代码!

通过利用列样式布局,变量名称、类型等也更易于阅读。通过按前缀对变量进行分组,我们未来的读者将很容易找到他正在寻找的内容,而无需使用高级搜索查询。

易于记录

列式布局更有优势。通过对我们的代码进行分组,我们可以添加一个保留用于注释的列。现在您可以阅读您的代码,甚至不需要颜色突出显示,并且向您的评论添加信息就像找到正确的列并修改它一样简单。此外,这种列式记录代码的方式与使用 Doxygen 之类的文档生成器后得到的差不多,无需使用此类工具。

容易发现错误

使用这种编码风格,注意到缺少的逗号是小菜一碟。只需寻找不以它开头的行!另一方面,我们在行尾有逗号。我们错过了一个?不,因为它是最后一个元素,或者因为表达式在下一行继续。查找列表中的第一个元素非常简单。在处理长行时,第一个元素很容易被忽略,但是通过将第一个元素放在它自己的行上并在其前面放置一个[{而不是,右,很容易发现。

易于扩展

您可能会说“但是一旦表达式变大,这种布局样式将变得无法处理!”,这是非常正确的,但这对于您的其余代码有什么不同吗?我认为通过使用列样式,您至少可以使代码保持可读性,从长远来看,这比您可能不得不将其放入列布局中的努力更有价值。

一个例子!

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!
        ]
    ];

TL; 博士

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

  • 易于阅读
  • 易于记录
  • 容易发现错误
  • 易于扩展
于 2015-11-16T20:34:19.877 回答
12

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

另外,在行的开头有逗号,可以更简单地在末尾添加一行,您只需触摸该行(您不需要在之前的行中添加逗号)。如果您使用版本控制(例如 diff、annotate、bisect),这很重要。有人可能会争辩说,在数组或对象的开头添加一行需要与两行相同的额外工作(如果您在开头使用逗号),但根据我的经验,在开头插入一行的可能性要小得多在末尾插入一行。

于 2012-05-07T14:27:53.833 回答
11

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

例如:

如果你有这个:

a,
b,
c

如果你需要删除,c那么你需要删除两件事:dec和上一行的逗号。如果你这样做:

a
,b
,c

现在您只需要删除 ,c 行。这种方式更有意义,因为b第一个示例中的 . 后面的逗号仅需要,因为c. 不过这样看起来确实更糟。这是代码的可维护性和外观之间的权衡。

于 2012-05-07T14:13:54.577 回答
9

我认为这样做是为了更容易发现遗漏的逗号。

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

var something = 0
  , foo = "a string"
    somethingElse = []
  , bar;
于 2012-05-07T18:52:30.650 回答
3

只需查看您的代码以验证您在需要的地方有一个逗号会更容易。如果您必须扫描每行代码的末尾,那么缺少的逗号不会像它们在左侧排列时那样跳出来。

于 2012-05-07T14:14:35.777 回答
2

这在不接受尾随逗号的语言中提供了一些保护,以免意外引入尾随逗号的语法错误

在 SQL 中,尾随逗号会导致语法错误。在 JavaScript 中,它会在大多数地方被接受,但在某些 Internet Explorer 版本中会失败并出现一个神秘的错误,例如。

JS 适用于大多数浏览器,但在某些浏览器中失败

var thing = {
 a: 1,
 b: 2,
 // trailing comma
 c: 3,
};

SQL 中的语法错误

SELECT
  col1,
  col2,
  -- Syntax error in SQL
  col3,
FROM table
于 2012-05-07T14:15:01.907 回答
1

这是确保在将新项目添加到集合时不会忘记逗号的一种方法,并且不会意外地在集合中留下逗号。

通过将其放在新线上,它在视觉上很明显。

我不在乎,但我明白人们为什么会这样。

于 2012-05-07T14:14:17.417 回答
0

您可能正在查看生成的代码,例如,在编写循环以生成 SQL 选择语句时,有时我会这样写:

sql =  "SELECT";
sql += "  table.id"; // or some field that will always be in the query
for (var i = 0; i < 10; i++;) {
  sql += ",  table.field" + i; 
}
sql += "FROM table" // etc

而不是在末尾添加逗号,然后有一个条件在循环的最后一次迭代中省略它或执行:

sql =  "SELECT";
for (var i = 0; i < 10; i++;) {
  sql += "  table.field" + i + ","; 
}
sql += "  table.id";
sql += "FROM table" // etc

这在功能上是等效的,但是 ID 并没有出现在我通常想要的位置。

于 2012-05-07T14:48:14.233 回答
-1

可能是因为删除或添加行及其逗号在第二个示例中更简单

于 2012-05-07T14:15:45.003 回答