Утверждения PHP (PHP assertions)?

Всех с наступившим! В книге «Совершенный код» Стив Макконелл рекомендует использовать утверждения (assertions) при написании кода для того, чтобы сделать очевидными для остальных программистов некоторые допущения в каждом конкретном месте программы и иметь возможность отлавливать нештатные ситуации, когда эти допущения оказываются неверными. В PHP существует 2 встроенные функции для работы с утверждениями:
  • assert — позволяющая записывать утверждения
  • assert_options — позволяющая задать различные опции обработки утверждений, в том числе обработчик по-умолчанию для неверных утверждений, аналогично функциям set_exception_handler и set_error_handler.
Я достаточно давно программирую на PHP, но встречал не так уж много кода, где бы использовались эти функции. Меня интересует ситуация, когда где-нибудь в середине метода или функции нужно явно указать на предполагаемую верность какого-либо утверждения. Например:

function doIt(){
    $a = 1;
    $b = 0;
    //...
    $b = $c[2];
    assert('$a == $b'); //Для дальнейшего выполнения программы это явно предполагается. До присвоения значения $b, утверждение может быть неверно.
    //...
}

Вопрос: каким образом более правильно использовать утверждения в PHP для указанной ситуации? Нужно ли использовать эти функции или же теперь это делается через системы модульного тестирования (т.е. методы наподобие assertEquals и т.п.)? Если используются модульные тесты, то каким образом решить проблему, приведенную в коде выше?
  • Вопрос задан
  • 3474 просмотра
Пригласить эксперта
Ответы на вопрос 5
taliban
@taliban
php программист
Вообще ассерты не для тестирования или проверки переменных, они больше для избавления от проверок. Ставите ассерт там где «не хотите проверять» код и забываете про него пока не увидете сообщение об ошибке. И ставятся они не там где вы знаете что будет ошибка, а там где _возможно может_ произойти ошибка, но не факт что вообще произойдет. Ассерты можно раскидать по таким местам и просто забыть про них до сообщения об ошибке. Они так же отключаются все глобально, поэтому можно не убирать из даже после выпуска проекта, а лишь отключать на живом.
Ответ написан
@shagguboy
я мало где исключения видел. а вы про ассерты.
Ответ написан
Раньше использовал assert('is_*($param)') для контроля типа параметров функций, но как-то от этой практики отказался, т. к. ни разу не сработали.
Ответ написан
Комментировать
Мы юзаем фреймворк onPHP, в котором присутствует класс Assert. Пользуемся не то, чтобы активно, но всё же.
Самый типовой случай: надо проверить, что конфиг заполнен нужными параметрами. Гораздо компактнее использовать assert, вместо кучи if.
В случае чего исключение кидается WrongStateException, а обрабатывается уж это по-разному. В крайнем случае остановка приложения и запись в лог.
Ответ написан
Комментировать
kalicz
@kalicz
Мы в качестве утверждений используем конструкцию вида if($unforseenCondition) trigger_error('Unforseen happened'). В зависимости от непредвиденности или внештатности ситуации это могут быть разные уровни оповещений.

Ошибки на тестовых средах превращаются в исключения с помощью set_error_handler(), а на производстве — собираются с помощью NewRelic (подробнее тут).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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