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

Оборонительное программирование в node.js с использованием утверждений

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

function doSomething(arg1, arg2){
  assert(!arg1, "arg1 is undefined");
  assert(!arg2, "arg2 is undefined");
  assert(!arg1.expectedFn, "arg1 does not have expectedFn");

  arg1.expectedFn(function(blah){
    ...
  }
}

Это особенно плохо в программах node/javascript? Это влияет на производительность?

4b9b3361

Ответ 1

(это скорее мнение, чем сообщение факта, поэтому возьмите его за то, что оно стоит)

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

Рассмотрим модифицированную (и несколько надуманную) версию doSomething -

function doSomething(arg1, arg2){
  var res = arg1.expectedFn(function(blah){
    ...
  }
  return res + arg2;
}

Я бы сказал, что нет смысла в проверке arg1 для существования или в нем есть имя функции expectedFn. Если либо undefined, то время выполнения javascript вызовет довольно понятный TypeError, который точно скажет, что произошло; утверждения являются излишними.

Однако вы можете найти здесь желательный тест arg2. Предположим, что это undefined, а res - строка или номер - в итоге вы добавите "undefined" к строке или верните NaN. Оба являются довольно тонкими ошибками, которые могут существовать в течение длительного времени, и никто не замечает - если вы хотите, чтобы он скорее сработал раньше, чем позже для целей отладки, тогда вы можете добавить несколько утверждений для обеспечения правильного типа.

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