Где выполнить проверку аргументов в JavaScript? - PullRequest
1 голос
/ 16 сентября 2009

Да, прочитайте правильно. В последнее время я видел разные шаблоны проверки аргументов в JavaScript (функции) и задавался вопросом, какой из них будет наилучшим. Сначала я покажу два примера кода. Первый показывает (по моим словам) «немедленную» проверку аргумента / условия, а второй - «отложенную» проверку. Каждый из них по-разному влияет на внешний вид следующего кода. До сих пор я всегда использовал «немедленную» проверку. Но постепенно я начинаю сомневаться, разумно ли втиснуть весь следующий код в такие условные блоки. Пожалуйста, скажите мне, что вы думаете и что может быть «лучшим» шаблоном.

А как насчет места, где объявлены переменные? Несколько раз я читал, что ВСЕ переменные должны быть объявлены в методе, прежде чем они будут фактически использованы. Это правильно? Поскольку я думаю, что бесполезно объявлять переменные до того, как они точно будут использованы (возможно, недопустимые аргументы вызывают исключение), я переместил часть объявления переменной за часть проверки аргумента / условия. Желательно ли это?

Спасибо!

Первый пример:

if (   colorStops.constructor === Array 
    && colorStops.length
    && colorStops.every(function(c) {
        return c instanceof ColorStop  
    })) 
{
    var privateVar1 = "foo",
        privateVar2 = "bar",
        privateVar3 = "tutifrutti";

    // here goes the code
}
else {
    throw new TypeError("GradientCanvasFacade: cannot add Colors; " +
        "invalid arguments received");
}

Второй пример:

if (cg instanceof ColorGradient) {
    throw new TypeError("PresetManager: Cannot add preset; " +
        "invalid arguments received");
}

var privateVar1 = "foo",
    privateVar2 = "bar",
    privateVar3 = "tutifrutti";

// here goes the code
// Here goes the code that get executed when no explicit 
// return took place ==> all preconditions fulfilled

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

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

function someFunc()
{
    if (1==1) 
    {
        var x = 1;
    } 
    else 
    {
        var x = 2;
    } 
    return x
}

Теперь представьте, что функция намного более сложная, по крайней мере, для меня объявление x в начале имеет большой смысл. Для переменных, обычно связанных с блоком (например, переменные и коллекции итераторов), я все же объявляю их в блоке.

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

0 голосов
/ 16 сентября 2009
if (some condition) {
  if (some other condition based in the first) {
    if (another condition based in 1st and 2nd) {
      do_job();
    } else?
  } else?
} else?

Где поставить блок else? После каждого if или после последнего?

Второй вариант кажется более читабельным

0 голосов
/ 16 сентября 2009

Я бы пошел со вторым просто потому, что его легче читать. Кроме того, с первой, если ваша функция очень длинная, кто-то, смотрящий внизу, будет удивляться, для чего это }, и должен будет подняться наверх, чтобы увидеть.

Кроме того, область видимости переменных очень ясна, даже для тех, кто забывает, что у javascript есть странные правила видимости.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...