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

Что выбрать между require и assert в scala

Оба require и assert используются для выполнения определенных проверок во время выполнения для проверки определенных условий.

Так в чем же основное отличие между ними?

Единственное, что я вижу, это require throws IllegalArgumentException и assert throws AssertionError.

Как выбрать, какой из них использовать?

4b9b3361

Ответ 1

Как Kigyo упоминается семантическая разница

  • assert означает, что ваша программа достигла несогласованного состояния, это может быть проблемой с текущим методом/функцией (мне нравится думать об этом как HTTP 500 InternalServerError)
  • require означает, что вызывающий метод ошибочен и должен исправить свой вызов (мне нравится думать об этом как HTTP 400 BadRequest)

Существует также существенная техническая разница:

assert аннотируется с помощью @elidable(ASSERTION) что означает, что вы можете скомпилировать свою программу с помощью -Xelide-below ASSERTION или с помощью -Xdisable-assertions, и компилятор не будет генерировать байт-код для утверждений. Это может значительно уменьшить размер байт-кода и повысить производительность, если у вас есть большое количество утверждений.

Зная это, вы можете использовать assert для проверки all инвариантов всюду в вашей программе (все предварительные условия/постусловия для каждого вызова метода/функции) и не платить цену в производстве.

Как правило, у вас есть "тестовая" сборка со всеми включенными утверждениями, она будет медленнее, так как она будет проверять все утверждения в любое время, тогда вы можете создать "производственную" сборку своего продукта без утверждений, которые вы бы устранили все внутренние проверки состояния, выполненные с помощью утверждения

require не является гибким, он имеет больше смысла для использования в библиотеках (включая внутренние библиотеки), чтобы информировать вызывающего пользователя о предварительных условиях для вызова данного метода/функции.

Ответ 2

Это только моя субъективная точка зрения.

Я использую require всякий раз, когда мне требуется ограничение на параметры.

В качестве примера мы можем взять факторный для натуральных чисел. Поскольку мы не хотим рассматривать отрицательные числа, мы хотим выбросить IllegalArgumentException.

Я использовал бы assert, когда бы вы не захотели убедиться, что некоторые условия (например, инварианты) всегда верны во время выполнения. Я рассматриваю это как способ тестирования.

Вот пример реализации факториала с require и assert

def fac(i: Int) = {
  require(i >= 0, "i must be non negative") //this is for correct input

  @tailrec def loop(k: Int, result: Long = 1): Long = {
    assert(result == 1 || result >= k)   //this is only for verification

    if(k > 0) loop(k - 1, result * k) else result
  }

  loop(i)
}

Когда result > 1 истинно, цикл был выполнен хотя бы один раз. Поэтому результат должен быть больше или равен k. Это будет инвариант цикла.

Если вы уверены, что ваш код верен, вы можете удалить assert, но require останется.

Ответ 3

На очень простом языке:

Require используется для обеспечения предварительного условия для вызывающей функции или создателя объекта некоторого класса. Принимая во внимание, что assert используется для проверки кода самой функции. Таким образом, если предварительное условие не выполняется, вы получаете illegal argument exception. Принимая во внимание, что если утверждение не выполнено, и это не ошибка вызывающей стороны, и, следовательно, вы получите assertion error.

Ответ 4

требовать, обеспечивать и инвариантность являются концепциями в процессе разработки по контракту.

требовать проверки предварительных условий, которые должен выполнить вызывающий абонент для использования процедуры.

проверить правильность возвращаемого значения (а также убедиться, что произошло только желаемое изменение и ничего более)

проверка инвариантности на достоверность класса во все критические моменты.

CBD - это методология разработки для создания правильного/надежного программного обеспечения. Для получения более подробной информации о CBD Google, и вы должны нажать на ссылку от Eiffel Software. Надеюсь это поможет.