Можно ли выбрасывать исключение в предикатах? Доброго дня.
Вопрос касается чистоты кода и стройности архитектуры. Не секрет, что предикаты - функции, которые должны возвращать булево значение, отвечая на какой-либо вопрос (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
338 +1
2
Ответы
1

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

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

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

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

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

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

20 Апр 2024 в 13:20
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир