По вопросу «что мне делать с этим» может быть много ответов.
Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .
Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.
Таким образом, вы можете избежать случаев NullReferenceException
, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X
в классе, а затем попытаетесь вызвать один из его методов, а X
имеет нулевое значение, то это приведет к NullReferenceException
:
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
По этой причине Код Контракт существует для приложений .NET.
В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .
ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .
Отсутствие производительности, просто вопрос личного выбора и стиля.
Первая версия является более сжатой.
Обновление:
Что касается количества данных, проходящих по проводу, то, конечно, меньше, тем лучше, однако для того, чтобы увидеть реальное воздействие, вам понадобится адское объявление var
.
Minification упоминается как что-то, что первый пример поможет с целью лучшей минификации, однако, как отмечает Daniel Vassallo в комментариях, хороший minifier автоматически сделает это для вас в любом случае , поэтому в этом отношении никакого воздействия вообще не было.
После прочтения Крокфорда и других, я начал цепляться за переменные исключительно запятой. Позднее меня действительно раздражало отладчик Chrome DevTools, который не останавливался на определения переменных с запятой. Для отладчика определения переменных, закодированные запятыми, представляют собой единый оператор, в то время как несколько операторов var - это несколько операторов, от которых может останавливаться отладчик. Поэтому я переключился с:
var a = doSomethingA,
b = doSomethignB,
c = doSomethingC;
To:
var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;
К настоящему времени я считаю второй вариант более чистым, не говоря уже о его преимуществе решения проблемы отладчика .
Аргумент «меньше кода через провод» не является убедительным, так как существуют мини-инструменты.
Я согласен с другими респондентами в том, что это в основном вопрос личного стиля. Но чтобы привести «авторитетное» мнение в дискуссию, это то, что Дуглас Крокфорд говорит на веб-сайте популярного инструмента JSLint :
] Но поскольку JavaScript не имеет области блока, разумнее объявить все переменные функции в верхней части функции. Для каждой функции рекомендуется использовать один оператор var. Это можно выполнить с помощью опции
blockquote>onevar
.
Как отмечали другие, это предпочтение стиля. JSLint может сказать вам, что у вас есть только одна функция var
за функцию (если вы используете «Хорошие детали»). Таким образом, если вы используете JSLint для проверки кода (не плохой идеи, IMHO), вы в конечном итоге используете первый формат больше, чем последний.
С другой стороны, тот же автор, Дуглас Крокфорд , говорит, что каждая переменная принадлежит своей строке в своих соглашениях кодирования . Поэтому вы можете снять флажок «Все один var
за функцию» в JSLint, если вы его используете. ; -)
Я предпочитаю обозначение var-per-variable
:
var a = 2
var b = 3
, потому что другие обозначения comma-instead-of-another-var
имеют эти три недостатка:
1. Трудно поддерживать. Рассмотрим этот код:
var a = 1,
b = mogrify(2),
c = 3
Но эй, что делает mogrify? Выделим b, чтобы узнать:
var a = 1,
b = mogrify(2),
console.log(b)
c = 3
разрывает материал
2. Трудно читать
var в попрошайничестве строки четко сообщает, что будет инициирована новая переменная.
var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
unicorn.legs.map((leg) => {
leg.log('yes')
})
}).sort(),
c = 3
Что, черт возьми, c = 3
делает там право ?
3. Не согласуется
. Рассмотрим это:
var a = 1,
b = 2,
c = 3
С var-per-variable
каждое объявление следует той же структуре. С comma-instead-of-another-var
первая переменная объявляется иначе, чем другие. Если вы решите, скажем, перенести первую переменную внутри цикла for, вам придется добавить var в середину объявлений
. Помимо предпочтений, похоже, что большинство известных проектов используют var-per-variable
обозначение
Я не думаю, что есть какая-то заметная разница, насколько мне известно, это просто личное предпочтение.
Мне очень жаль, что у меня есть несколько объявлений var, поэтому я обычно делаю:
var
one
,two
,three
,four
;
Поскольку он короче и, возможно, более читабельен, нет шума var
для просмотра.
Я предпочитаю вторую версию (у каждого есть свой var
). Я думаю, это потому, что я родом из C ++. В C ++ вы можете объявлять переменные, как в первом примере, но на него нахмурились (это легко приводит к ошибкам, когда вы пытаетесь создать указатели таким образом).
Если вы уменьшаете свой javascript, существует довольно большое преимущество:
var one, two, three, four;
становится
var a, b, c, d;
Где в качестве
var one;
var two;
var three;
var four;
становится
var a;
var b;
var c;
var d;
Это дополнительные три экземпляра var
, которые могут складываться с течением времени.
См. статью «A List Apart» серии «Лучшая Javascript Minification» Часть 1 и Часть 2
Поскольку я не вижу ссылок на него, здесь является ссылкой на спецификацию ECMA-262, которая является базовым спецификацией для JavaScript. Грамматика с этой страницы говорит:
12.2 Variable Statement
Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
То, что вы можете извлечь из этого, использует запятые или нет, не имеет значения. В любом случае, он заканчивается анализом как VariableDeclaration
и обрабатывается точно так же. Не должно быть никакой разницы в том, как механизм сценария обрабатывает два объявления. Единственные различия были бы уже упомянуты в других ответах - сэкономить больше пространства и практически неизмеримые различия в количестве времени, которое требуется для применения грамматики, чтобы найти все VariableDeclarations
при компиляции скрипта.
Первый сохраняет несколько символов - таким образом, существует очень небольшая экономия с точки зрения размера JS и, следовательно, потребления полосы пропускания. Единственный момент, когда это станет заметным, будет в крайних случаях.