Использование утверждений в коде, а не только в тестах - PullRequest
0 голосов
/ 15 декабря 2018

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

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

«Сообщение печатается», выделенное вприведенное выше определение привлекло мое внимание.

Мой вопрос заключается в том, можем ли мы расширить использование утверждений assert в самом коде и перехватывать AssertionErrors для регистрации сообщений, а не только тестов?В основном, чтобы избежать слишком многословных утверждений if-else (кстати, я ненавижу if-else, лично).Например, все перечисленные ниже

String response = aMethod(sendSomething);
if (response!=null && response!="") {
  //blah blah
} else { 
  log.error("Response is null");
  throw new NoDataFoundException();
}

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

try{
   assertThat(aMethod(sendSomething), notNullValue());
} catch (AssertionError e) {
   log.error(e.getMessage());
}

1 Ответ

0 голосов
/ 15 декабря 2018

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

(*) ОК, вы можете поймать его, если смысл его поймать - записать все, что вы ожидаете, чтобы диагностировать проблему, а затем выйтибыстро.

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

Что касается того, что я считаю вашей общей точкой зрения: да, если выПроверяйте предварительные / постусловия вообще, оставьте проверки в коде доставки.

Мой код будет выглядеть так:

  response = aMethod(sendSomething);
  if (response == null || response.isEmpty())
     throw new InternalError("....");

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

...