Утверждайте по сравнению с, возвращают false? [закрытый]

Веб-хостинг на самом деле не играет нечестно. Это не совсем в соответствии с правилами - но по сравнению с некоторыми из удивительных изобретений, предназначенных для предотвращения спама, это не особенно плохо.

Если вы действительно хотите отправлять почту с «@ gmail.com», почему бы просто не воспользоваться службой SMTP gmail? Если вы не можете перенастроить сервер, на котором работает PHP, то существует множество инструментов для работы с электронной почтой, которые позволяют вам задавать настраиваемые SMTP-реле phpmailer.

С

5
задан George Stocker 28 May 2009 в 10:58
поделиться

12 ответов

Assert , по крайней мере, в .NET, используется для тестирования в основном . Его конкретное использование кратко здесь :

Утверждение лучше всего использовать для проверки условия только тогда, когда выполняются все следующие условия:

* the condition should never be false if the code is correct,
* the condition is not so trivial so as to obviously be always true, and
* the condition is in some sense internal to a body of software.

В производственном коде я бы рекомендовал первый метод; или try / catch , если «чего-то плохого» не ожидается; если это исключительное условие.

Если у вас есть инвариант, который должен всегда или никогда не быть (независимо от состояния системы), то это хороший кандидат для Assert вне простого прецедент.

Я видел утверждения в производственном коде; обычно в код стиля «дизайн по контракту» . Я гораздо чаще вижу их в модульных тестах.

5
ответ дан 18 December 2019 в 10:48
поделиться

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

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

3
ответ дан 18 December 2019 в 10:48
поделиться

Рассмотрите возможность использования исключения, когда «случилось что-то плохое» = что-то исключительное ...

3
ответ дан 18 December 2019 в 10:48
поделиться

Ваш "return false" также называется GuardClause - как объяснил Уорд Каннингем:

... [G] uards похожи к утверждениям в том, что оба защищают последующие код из частных случаев. Охранники отличаются из утверждений в том, что они делают ощутимый вклад в логику метод и, следовательно, не может быть безопасным опущено как часть оптимизации. я позаимствовал термин охрана у EwDijkstra при названии этого шаблона.

Если ваше защитное предложение имеет любую сложность, часто бывает полезно инкапсулировать с использованием BouncerPattern .

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

Сегодня мы понимаем, что в большинстве случаев вставлять утверждения в ваш код - не лучшая идея. Классическое разделение проблем. Отделяйте утверждения от кода и инкапсулируют их в модульном тесте. Это устраняет сложность перекомпиляции кода без утверждений для распространения (вы не будете распространять свои тесты ... ), а также предоставляет вам набор тестов, которые можно запускать непрерывно для выявления регрессий и проведения рефакторинга.

В других ответах упоминалось Дизайн по контракту , который полностью учитывает эти проблемы из вашего кода и в заявленных предварительных условиях , постусловия и инварианты, которые применяются к рассматриваемому коду. Если вы делаете это часто, вы можете рассмотреть возможность изучения структуры «Дизайн по контракту» для вашего языка.

2
ответ дан 18 December 2019 в 10:48
поделиться

IMHO, assert - это утверждение разработчика в среде отладки, что происходит что-то неожиданное (неправильное). Не все утверждения должны быть критическими, и разработчики должны размещать утверждения для реальных ошибок.

В режиме выпуска вам нужно вернуть false только тогда, когда ошибка критическая и нет смысла продолжать выполнение.

1
ответ дан 18 December 2019 в 10:48
поделиться

Используйте утверждение, когда что-то плохое никогда не должно произойти, если код работает правильно. Пример:

int div( int a, int b ) {
  assert( b != 0 );
  return a / b;
}

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

Используйте if () ... return, когда может произойти ошибка, которую можно устранить. Например, при открытии файла может произойти сбой, и программа должна быть обнаружена и устранена - сбой не переводит программу в неизвестное состояние.

1
ответ дан 18 December 2019 в 10:48
поделиться

Assertions are for quality control purposes only. Removing them must not alter the behaviour of your program (i.e. your program must not rely on assertions to handle anything at all). Use exceptions if something happened that should not happen, but can happen under bad circumstances - e.g. network connection lost. Use return values to indicate success when failure is also an option.

1
ответ дан 18 December 2019 в 10:48
поделиться

That really depends on language/runtime environment, and the nature of the error.

In general, the program cannot recover from assertion failures (i.e. it will crash). That may or may not be what you want.

If your environment supports exceptions, you could also use these, that allows you to handle the error if you want to, and will abort with a helpful message if you dont handle the error.

The "return false" thing is error prone (b/c people forget to check the return value), so I'd use it only if neither assert nor exceptions are available.

0
ответ дан 18 December 2019 в 10:48
поделиться

Зависит от того, что вы проверяете. В первом случае, если произошедшая неприятность нарушает контракт для вашего класса, генерируйте исключение, которое будет что-то значить для клиента. Если вернуть false, никто не узнает, что состояние неверное.

0
ответ дан 18 December 2019 в 10:48
поделиться

Simple answer is both, but the second is more important. The assert checks a design assumption, thus before calling fn() I would have pre-conditions, e.g. that a given resource might be available. The assert will typically do nothing in release code, though not necessarily. If it is important that your function, gn, require something be true to work correctly, it eithers uses the if statement and returns and error code, or throws an exception. Assert typically does nothing in release code and thus your function might crash in this situation.

See also the more detailed answers given to this question

0
ответ дан 18 December 2019 в 10:48
поделиться

I would use assert whenever something like a contract is broken. What do I mean by this: in math, division by zero is not defined. So the contract with the division function is broken. More on contract see the progromming language Eiffel.

In some cases I would then implement a second function that has additional parameter(s) with default values and handles the exception, like StrinToIntegerDef(string, default), that returns default when string does not convert to Integer.

Return false can be done in cases where normal execution of the program is not at stake.

I would prefer meaningful exceptions, at least of the form assert(condition, message), if the language allows for that.

Also, if there are several possibilities to fail, return some enum values instead of false.

0
ответ дан 18 December 2019 в 10:48
поделиться

Use assertions to mandate the function's preconditions (conditions that must hold true if the function is to have any meaning).

0
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: