Можно ли выбрасывать исключение в предикатах? Доброго дня.
Вопрос касается чистоты кода и стройности архитектуры. Не секрет, что предикаты - функции, которые должны возвращать булево значение, отвечая на какой-либо вопрос (is directory exists?). Поскольку я год назад начал плотно угорать по исключениям (ибо они рулят), ныне я редко возвращаю false или null в случаях, когда false или null должны вести за собой прекращение работы программы. Я продолжаю их возвращать, когда ситуация допустима, но когда это ошибка - всегда выбрасываю исключение.
Собственно, суть вопроса в том, что в ряде случаев удобно сунуть выброс исключения в предикат. Таким образом, он, в ряде случаев, будет возвращать только true или выбрасывать исключение. Так лучше не делать, верно? И как делать в таких случаях, если код, генерящий исключение, хочется инкапсулировать в функцию? Делать дополнительную функцию-обертку над предикатом?Закончу вопрос примером.isDirectoryNameCorrect()) {
// ранее исключение выбрасывалось тут, я считаю, это некрасиво
// do stuff
}
throw new Exceptions\UnexpectedError(
'Something wrong here'
);
}
/**
* Вот это - предикат. Я сделал так, чтобы избавить entry point,
* функцию handle, от ада выбросов исключений, когда проверяется много
* условий и выкидывается много исключений в одном методе.
* Когда один метод > одна проверка > строго связанные с ней исключения,
* это красиво.
*/
private function isDirectoryNameCorrect()
{
if(!config('mosaic.directory', null)) {
throw new Exceptions\InvalidSettingsException(
'Directory for mosaic photos is not setup properly'
);
}
return true;
}
}
Заранее спасибо.

21 Авг 2019 в 06:19
304 +1
1
Ответы
1

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

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

В вашем примере вы использовали выброс исключения в предикате isDirectoryNameCorrect(), чтобы избавить entry point от работы с исключениями. Это неплохой подход с точки зрения отделения логики проверки условий от основной логики программы. Однако, если вы беспокоитесь о чистоте кода и соответствии принципам SOLID, вы можете рассмотреть другие варианты.

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

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

Выбор подхода зависит от конкретной ситуации и предпочтений разработчика. Главное - сохранить читаемость и стройность архитектуры вашего кода.

20 Апр в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир