2011-01-21 4 views
10

Хотя я понимаю, что у каждого языка есть своя конвенция для отступов, я не могу не раздражаться тем, что я недавно обнаружил. Рассмотрим этот код из руководства PHP:Отступ PHP-кода от JavaScript

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

Обратите внимание, что каждый случай имеет отступ от инструкции переключателя. Это имеет смысл, так как код легче читать, а тело блока содержит один уровень внутри него.

Однако, когда я проверить эквивалентное утверждение JavaScript переключатель в JSLint:

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

JSLint на самом деле жалуется на подобные вещи? * -dies- * – BoltClock

+0

JS & PHP не Python, используйте отступ, который вам нравится. – Shikiryu

+8

Я бы использовал 'if ([" apple "," bar "," cake "]. IndexOf (i)! = -1) alert (" i is "+ i);';) – Gumbo

ответ

6

Это ваш код. Отформатируйте его так, как вы хотите. Используйте jsLint, но если вы не согласны с тем, что его рекомендации улучшают ваш код, не выполняйте их. jsLint вредит вашим чувствам.

+2

Точно. Крокфорд не какой-то бог JS, чьи правила вы должны соблюдать, хотя я уверен, что есть некоторые флажки, которые вы можете проверить/снять, чтобы не иметь строгих предупреждений/ошибок в виде пробелов. –

+2

Я тоже согласен с этим, но в этом случае мои чувства не так сильно обижены, как они раздражены. Я бы ни в коем случае не считал это «ошибкой». Кроме того, ни один из вариантов, похоже, не подавляет его. Причина, по которой это проблема, состоит в том, что инструмент обнаруживает множество потенциальных проблем (это не один из них), и наличие кучи не ошибочных «ошибок» затрудняет просмотр действительных. – claviska

2

До тех пор, пока ваш отступ может быть логически обоснован, вы должны отступать в стиле, который вы предпочитаете. Если JSLint действительно жалуется на это, то это чересчур педантично.

+0

Согласен. JSLint - отличный инструмент, но, учитывая предпочтение отступов, «ошибка» кажется немного придирчивой, особенно когда полученный код менее ясен. – claviska

+0

На самом деле это отличный инструмент. Это чересчур педантично о вещах, которые не делают другого (только стиль, а не ошибки); тем не менее, вещи, которые будут вызывать ошибки (т. е. определенный тип глобальных утечек), просто игнорируются. JSLint - это змеиное масло. –

0

Это просто соглашение для JS (как JSLint определяет конвенцию). Лично я считаю, что PHP был бы здесь не так (не знаю, если руководство следует за любым соглашением, я знаю, что стандартная библиотека этого не делает). Я предпочитаю стиль JS, потому что он может стать действительно неприятным, если вы находитесь в нескольких вложенных блоках. Например (код PHP):

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

В конечном счете, на ваш выбор. Я бы не использовал руководство PHP как руководство по стилю; если вы не можете использовать разные стили для разных языков, используйте четко определенный стиль JS.

+0

Просто установите ваши вкладки в 2 пробела, если вы ограничены горизонтальным пространством. – erjiang

+0

Вы забыли if (is_array ($ arr)), если вы пытаетесь получить глупые уровни отступов :) – GordonM

+0

@Gordon застрели меня сейчас –

1

Хотя форматирование важно, в конце концов это ваше форматирование. Сделайте это, как вам нравится. Особый стиль, который вы выбираете, является личным выбором, и многие стили могут быть «хорошими». Тем не менее, любой «хороший» стиль форматирования должен быть последовательным - выберите нужные вам правила и отметьте .

Это как-то забавно для меня, как дебаты бушуют над такими вещами, как размещение {на той же линии, что и предыдущий код или нет, или «обнимать фигурные скобки» вокруг else. Я думаю, что только коммунисты размещают {в той же строке, что и их заявление if. :)

+0

Угадайте, я коммунист: P Опять же, проблема в том, что запуск ложных ошибок делает трудно увидеть потенциально действительные. – claviska

+0

До тех пор, пока вы последовательная команда, вы в порядке со мной. Непоследовательный форматер любого убеждения, это просто не круто. –

+0

Достаточно честный для меня :) – claviska

0

Экстра-пробелы анализируются из JavaScript и PHP, когда они интерпретируются, поэтому вы можете сделать свой код столь же уродливым, как хотелось бы. Лично я предпочитаю, чтобы добавить дополнительные фигурные скобки, чтобы мои высказывания переключателя, так что я не пропускаю ошибки от падения через:

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; 
} 

Сканирование вниз кода в конце скобки позволяет мне проверить Если я добавил правильные заявления перерыв , Вы можете видеть, что в случае 'something' отсутствует инструкция break (возможно, специально, может быть, ошибка).

Некоторые из них будут не согласны с этим форматом, но это действительно то, что я получаю. Формат не имеет большого значения. Парсеры довольно прощающие. Найдите то, что работает для вас, и придерживайтесь его.

4

В книге Крокфорда он утверждает, что блоки не вводят новый масштаб. «JSLint ожидает блоки с функцией, если, переключать, пока, для, делать и пробовать утверждения и нигде больше».

Кроме того, что

if (condition){ 
    statements; 
} 

рекомендуемый метод выполнения блоков; поскольку он «более устойчив». Я очень сомневаюсь, что он был построен таким образом по ошибке.

0

Я также нашел, что это очень сбивает с толком, и нашел эту причину в кодексе конвенций Дугласа Крокфорда в для JavaScript языка программирования на http://javascript.crockford.com/code.html

Морозов (случай, поймать, по умолчанию, в противном случае, в конце концов) не являются заявлением и , поэтому не следует делать отступы как заявления.

Смежные вопросы