PHP与JavaScript切换缩进

时间:2011-01-21 16:36:50

标签: php javascript switch-statement conventions

虽然我意识到每种语言都有自己的缩进惯例,但我不禁对最近发现的东西感到恼火。请考虑PHP手册中的代码:

switch ($i) {
    case "apple":
        echo "i is apple";
        break;
    case "bar":
        echo "i is bar";
        break;
    case "cake":
        echo "i is cake";
        break;
}

请注意,每个案例都是从switch语句缩进的。这是有道理的,因为代码更容易阅读,并且块的主体包含在其中的一个层次。

但是,当我在JSLint中测试等效的JavaScript switch语句时:

switch (i) {
    case "apple":
        alert("i is apple");
        break;
    case "bar":
        alert("i is bar");
        break;
    case "cake":
        alert("i is cake");
        break;
}

...它显示一个错误,告诉我它应该显示为:

switch (i) {
case "apple":
    alert("i is apple");
    break;
case "bar":
    alert("i is bar");
    break;
case "cake":
    alert("i is cake");
    break;
}

这似乎违反直觉,因为现在每个案例都与交换机块本身内联。我无法想象为什么这会被认为更好,更不用说触发错误了。

JSLint是错误的,还是仅仅遵循约定?如果后者是真的,为什么惯例不能缩小以澄清?

8 个答案:

答案 0 :(得分:6)

这是你的代码。格式化你想要的方式。使用jsLint,但如果您不同意其建议可以改进您的代码,请不要实现它们。 jsLint伤害了你的感情。

答案 1 :(得分:4)

在克罗克福德的书中,他指出街区不会引入新范围。 “JSLint期望具有函数的块,if,switch,while,for,do和try语句以及其他任何地方。”

还有那个

if (condition){
    statements; 
}

推荐的做块的方法;因为它“更有弹性”。我非常怀疑它的结构是错误的。

答案 2 :(得分:2)

只要您的缩进可以在逻辑上合理,您应该以您喜欢的样式缩进。如果JSLint真的抱怨这个,那么它就过于迂腐了。

答案 3 :(得分:1)

虽然格式很重要,但最终还是格式化。按你喜欢的方式做。您选择的特定风格是个人选择,许多风格可以“很好”。但是,任何“好的”格式化样式必须保持一致 - 选择您喜欢的规则并坚持使用

对我来说,如果辩论如何放置{与前面的代码在同一条线上,或者在else周围“拥抱大括号”这样的事情,这很有趣。我认为只有共产党人才能{与if陈述在同一条线上。 :)

答案 4 :(得分:0)

这只是JS的惯例(因为JSLint定义了约定)。就个人而言,我认为PHP在这里是错误的(如果手册遵循任何类型的约定,dunno,我知道标准库没有)。我更喜欢JS风格,因为如果你在几个嵌套块中它会变得非常讨厌。例如(PHP代码):

 class Foo{
      function Bar($arr) {
          foreach($arr as $item) {
              switch ($item) {
                  case "foo":
                       // Do something
                       break;
                       // You get the idea

最终,你的选择。我不会将PHP手册用作样式指南;如果你不能为不同的语言使用不同的样式,请使用定义良好的JS样式。

答案 5 :(得分:0)

解释时,JavaScript和PHP会解析额外的空格,因此您可以根据需要使代码变得丑陋。我个人更喜欢在我的switch语句中添加额外的花括号,这样我就不会错过直接错误:

switch ($someVar)
{
  case 'value':
  {
    //your code here
  } break;
  case 'something':
  {
    //more code here
  }
  case 'something else':
  {
    //some more code here
  } break;
  default:
  {
    //default code here
  } break;
}

扫描结束括号中的代码可以让我检查是否添加了正确的break语句。您可以看到'something'案例缺少中断语句(可能是故意的,可能是错误的)。

有些人会不同意这种格式,但这正是我所得到的。格式并不重要。解析器非常宽容。找一些适合你的东西并坚持下去。

答案 6 :(得分:0)

这是他的Java背景泄漏。 JSLint方式模仿official Java conventions for switch case。我更喜欢你的第一个例子,但我正在学习容忍JSLint方式。

答案 7 :(得分:0)

我也发现这非常令人困惑,并在http://javascript.crockford.com/code.html

中找到道格拉斯克罗克福德的 JavaScript编程语言代码约定的原因
  

子句(case,catch,default,else,finally)不是语句和   所以不应该像语句那样缩进。