Правда ли, что я должен использовать стиль K&R при написании javascript?

Я не осознавал этого до недавнего времени, но я использую стиль Allman при написании кода javascript. .

Согласно http://encosia.com/in-javascript-curly-brace-placement-matters-an-example/ Я должен использовать K&R стиль. Это связано с тем, что в некоторых ситуациях размещение фигурной скобки на следующей строке может вызвать проблемы. Проблема для меня в том, что я довольно полюбил стиль Оллмана и не хотел бы его менять.

Итак, мои вопросы

  • Правда ли, что стиль allman может вызывать ошибки из-за размещения фигурных скобок в javascript? Как насчет jquery?

  • Есть ли какой-нибудь трюк, который позволил бы мне без проблем использовать стиль Allman из-за фигурных скобок?

  • Есть ли другие проблемы, связанные с использованием этих стилей?


person TryHarder    schedule 02.09.2012    source источник
comment
Я думаю, это зависит от того, как часто вы возвращаете литералы объектов   -  person Tina CG Hoehr    schedule 02.09.2012
comment
Я не вижу никаких проблем, которые могут возникнуть, кроме читабельности. Однако мне кажется, что K&R имеет больше смысла, поскольку я часто объявляю функции и/или объекты в вызовах функций (например, setTimeout(1000, function() { complex_functions_content }); Содержимое сложной функции будет в новой строке, а закрывающие скобки (как фигурные, так и круглые) в последней строке, на том же уровне отступа, что и вызов функции setTimeout.Написание такого кода в стиле Allman выглядело бы странно, ИМХО.   -  person Mark    schedule 02.09.2012
comment
В любом случае, я действительно не думаю о возврате как об операторе управления, поэтому мне кажется странным, что стиль Оллмана должен вызывать проблемный код в примере в первую очередь. В качестве побочного вопроса: происходит ли автоматическая вставка точки с запятой где-либо еще, кроме как после возврата, где она может аналогичным образом нарушить предполагаемое поведение?   -  person Kirk Boyer    schedule 02.09.2012
comment
Да, это вызовет пламенную войну на SO, как это было сотни раз раньше. Только сегодня утром я на самом деле прочитал комментарий, в котором автору было сказано использовать табуляцию или отступ в 4 пробела, что для меня просто глупо и ломает сообщения в SO на iDevices.   -  person mplungjan    schedule 02.09.2012
comment
Помимо формальностей, я думаю, что египетские скобки выглядят красивее .   -  person Jezen Thomas    schedule 02.09.2012


Ответы (2)


Правда ли, что стиль allman может вызывать ошибки из-за размещения фигурных скобок в javascript?

Да, это. Как поясняет ваша ссылка, операторы return, за которыми следует новая строка, сбивают с толку синтаксический анализатор, поскольку он пытается вставить точку с запятой. Однако это поведение не ограничивается возвратом литералов объекта. Следующая функция:

function foo()
{
    return
        "bar";
}

Также вернет undefined.

Как насчет jquery?

Ситуация остается точно такой же, независимо от того, включен jQuery или нет.

Есть ли какой-нибудь трюк, который позволил бы мне без проблем использовать стиль Allman из-за фигурных скобок?

Да, не используйте стиль Allman с объектными литералами. Предположим, вы хотите присвоить объектный литерал переменной. Вы действительно собираетесь написать:

var foo =
{
    bar: "quux"
};

Или вы пойдете на:

var foo = {
    bar: "quux"
};

ИМХО второй сниппет читабельнее первого. Вы можете продолжать использовать стиль Allman с фигурными скобками внутри for, if, while, function и т. д., но сделать исключение для литералов объектов.

Есть ли другие проблемы, связанные с использованием этих стилей?

return — это особый случай, потому что он допустим как с аргументом, так и без него. Столкнувшись с одиночным оператором return в одной строке, синтаксический анализатор не может сказать, должен ли он добавить точку с запятой, чтобы сделать однострочный оператор действительным, или перейти к следующим строкам и надеяться на лучшее.

По этой причине я думаю, что такое поведение становится проблемой только с return и, возможно, throw, а не с другими операторами.

person Frédéric Hamidi    schedule 02.09.2012
comment
такое поведение соответствует спецификации и становится проблемой не только с return - person Oleg; 02.09.2012
comment
@o.v, на практике continue и break принимают необязательный идентификатор, а не литерал объекта. do ... while будет создавать проблемы только в том случае, если while оценивает литерал объекта, что, возможно, является довольно сложным способом реализации бесконечного цикла. Тем не менее, ваша точка зрения на throw остается в силе, даже если по моему опыту выбрасывание объектных литералов довольно редко. - person Frédéric Hamidi; 02.09.2012
comment
На самом деле я сосредоточился не на конкретном сценарии OP со скобками, а скорее на невозможности разбить строки после этих утверждений в целом (т. Е. Нет continue[label], да), а на способности разбивать строки так часто, как они хотят, после условных выражений и т. д. - person Oleg; 02.09.2012
comment
Часть литералов объектов больше не актуальна — все современные браузеры и node.js принимают объекты, написанные в стиле Allman. - person Piotr Jurkiewicz; 28.08.2014
comment
@Piotr, я перепроверил и не понимаю, что вы имеете в виду - мой node.js (0.10.31) все еще имеет функцию foo() в моем первом фрагменте return undefined . - person Frédéric Hamidi; 28.08.2014
comment
@Frédéric, я писал о вашем втором фрагменте, использование стиля Allman прекрасно подходит для назначения объектов. Стиль Allman следует избегать только после return и, возможно, throw - эта часть вашего сообщения все еще действительна. - person Piotr Jurkiewicz; 28.08.2014
comment
@Пётр, а, понятно. Я никогда не говорил, что стиль Allman недействителен при назначении, просто менее читаем. - person Frédéric Hamidi; 28.08.2014

Учтите спецификацию ECMAScript, касающуюся автоматической вставки точки с запятой:

Некоторые операторы ECMAScript (пустой оператор, оператор переменной, оператор выражения, оператор do-while, оператор continue, оператор break, оператор return и оператор throw) должны заканчиваться точкой с запятой. Такие точки с запятой всегда могут явно появляться в исходном тексте. Однако для удобства в некоторых случаях такие точки с запятой могут быть опущены в исходном тексте. Эти ситуации описываются тем, что в таких ситуациях точка с запятой автоматически вставляется в поток токенов исходного кода.

Я смеюсь над предложением выше, что это "удобно"...

Хотя технически вы могли бы продолжать использовать форматирование Allman в случаях, не описанных выше, я бы проповедовал согласованность. Лично мне нравятся разделы Google JS styleguide, относящиеся к вашему относятся к форматированию кода и точки с запятой единицы. Перечисленные там примеры заслуживают проверки.

person Oleg    schedule 02.09.2012