Подтвердить что ты не робот

Настойчивое программирование с использованием JavaScript

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

Например, этот код сделает ошибку и прервет пользователей.

function getDomainFromURL(url) {
    assertTrue(url, 'URL should not be null');

    ...parsing
}

Итак, я бы сделал так.

function getDomainFromURL(url) {
    if (!url) return;

    ...parsing
}

Во-вторых, хорошо для удобства использования, я думаю, и первый из них хорош для развития. Поэтому ИМО было бы лучше всего объединить их и заставить assert исчезнуть на производственном коде.

Вопрос 1 Ты так думаешь? Или есть какая-то другая идея?

Вопрос 2 Если вы так считаете, есть ли хороший способ сделать это с помощью Spring3 framework?

4b9b3361

Ответ 1

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

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

Лично я буду использовать первую форму везде, как в разработке, так и в производстве. Если утверждение не сработает, вы получите очень полезную обратную связь (в браузере, журналах и т.д.) О причине вашей проблемы. Если вы удалите это утверждение, у вас все еще будет ошибка, но будет сложнее отследить

Помимо

Этот стиль программирования - проверка предварительных условий - является частью так называемого контрактного программирования. Я никогда не слышал о терминах "настойчивое программирование" раньше.

Ответ 2

Нельзя использовать утверждения для проверки любых входных данных пользователя. Они также не должны использоваться для проверки ошибок. Assert - способ облегчить отладку для программиста в случае неудачных тестов. Также это способ сделать код более понятным.

Рассмотрим следующий пример:

function calculateSomeCrazyFormula(a,b,c) {
    var d = a+b+c;
    ....
    k = (x + y)*2;

    assert(k != 0);
    l = d/k;        
    ....
    return x;
}

Моя формула по спецификации уверяет, что k никогда не будет 0. Здесь я использовал утверждение почти как комментарий в своем коде. Он не подтверждает логику - это совершенно противоположное. С утверждениями я проверяю правильность моей реализации этой сложной логики. Позже, когда я вернусь к своему коду и посмотрю l = d/k, я не буду подозревать, что происходит, когда k равно 0, потому что я вижу там свой assert и понимаю, что 0 никогда не должно происходить.

Кроме того, если есть ошибка где-то и 0 произойдет, вы, как правило, увидите более глубокую ошибку. Например:

function otherFormula(a,b,c) {
    var x = calculateSomeCrazyFormula(a,b,c);

    var y = doSomeStuff(x);
    var z = doOtherStuff(y);
    return z;    
}

Без утверждений вы получите неправильный результат этой функции. Вы не поймете, почему вы получаете 0, когда это должно быть 1. Вам нужно будет начать отладку кода за строкой и понять, что пошло не так.

С утверждениями, однако, вы мгновенно заметите ошибку "assertion failed" и мгновенно скроете область поиска проблемы.

Утверждения полезны на любом языке программирования, включая Javascript, однако они не должны присутствовать в среде Live. Поэтому некоторые постпроцессорные системы должны удалить все утверждения из вашего кода до выпуска.

Ответ 3

Я не думаю, что было бы хорошо иметь настойчивое программирование в Javascript по двум причинам:

  • Мне не нравится тот факт, что проверка ошибок должна выполняться в производственной среде.
  • Люди разработали специально для этой цели (JsUnit).
  • этот оператор assert увеличивает размер кода, что увеличивает время загрузки и время выполнения.

Лучший способ сделать это - написать unittests. Таким образом, вы можете обеспечить, чтобы ваш код не прерывался при его обновлении, а также означает, что assert не будет отображаться в вашем производственном коде. Конечно, вам НЕОБХОДИМО иметь такие вещи, как if (condition) error();, поскольку это условие может зависеть от пользователя, а не от разработчика. Те будут неизбежны, и вам нужно будет их вручную закодировать.

Общее правило:

  • используйте if (condition) error();, когда условие зависит от пользователя
  • пишите unittests, если условие зависит от разработчика.

Наконец, с помощью unittesting вы можете проверить правильность ошибок кода. Я не слишком уверен в JsUnit, но вы могли бы сделать что-то подобное в своих тестах:

assertThrow(somefunc, args, YourError);

чтобы идти вместе с вашим if (condition) error(); в вашем коде

Ответ 4

Всегда существует необходимость в обработке условных ошибок, когда вы имеете дело с асинхронными и управляемыми пользователем данными. Бывает. Пользователи и сети завинчиваются. Такова жизнь. Лучше всего иметь, как минимум, второй пример , если и только если разумно ожидать, что данные могут быть повреждены. Если вы отвечаете за предоставление данных, которые вы тестируете, вам необходимо убедиться, что перед рукой, что данные действительны.

Почему бы не иметь комбинацию:

function getDomainFromURL(url) {
    if( !assert( url != undefined, 'URL should not be null.' ) ) 
        return ''; 
    // '' is optional, but I don't like returning null if I expect a value.
    /* blah blah blah */
}

// as lightweight a function as you can have.
function assert( val, msg )
{
    if( !val )
    {
        console.log( msg );
        return false;
    }
    return true;
}

Собственно, подумайте об этом, я часто использую этот точный шаблон.

Ответ 5

Просто проигнорируйте его и повторите попытку.

Бесшумно неудача - это не очень хорошая идея. С точки зрения удобства использования пользователи должны иметь немедленную обратную связь о своих действиях, даже в случае ошибок. Вы должны показать простую страницу ошибок, когда что-то исключительное происходит в вашем коде. Идея здесь в том, что не работает быстро.

Я бы сделал вашу функцию assert перенаправленной на страницу с ошибкой, если условие не выполнено, и запишите ее. Вы можете сделать это в Javascript, установив window.location.href и зарегистрировав свою ошибку, разместив XHR.

Ответ 6

Вы можете использовать его следующим образом:

function getDomainFromURL(url) {
   assert(url != null, "url is null");
   if (!url) return;
    ...parsing
}

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

В качестве бонуса ознакомьтесь с утверждением, которое можно найти здесь:

http://aymanh.com/9-javascript-tips-you-may-not-know/