Можно ли выбрасывать исключение в предикатах? Доброго дня. Вопрос касается чистоты кода и стройности архитектуры. Не секрет, что предикаты - функции, которые должны возвращать булево значение, отвечая на какой-либо вопрос (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; } } Заранее спасибо.
Добрый день! Ваш вопрос касается подхода к использованию исключений в предикатах, и это действительно интересная тема.
Обычно предикаты используются для проверки условий и возвращают булево значение, чтобы управлять логикой программы. Однако, если предикату требуется выбросить исключение в случае ошибки, это может нарушить принцип чистоты кода.
В вашем примере вы использовали выброс исключения в предикате isDirectoryNameCorrect(), чтобы избавить entry point от работы с исключениями. Это неплохой подход с точки зрения отделения логики проверки условий от основной логики программы. Однако, если вы беспокоитесь о чистоте кода и соответствии принципам SOLID, вы можете рассмотреть другие варианты.
Один из вариантов - использовать возвращаемое значение предиката для управления логикой программы, а исключения выбрасывать выше, например, в методе handle(). В этом случае, предикат будет возвращать true или false, а исключение будет выбрасываться в нужном месте.
Еще один вариант - создать дополнительную функцию-обертку над предикатом, которая будет обрабатывать исключения и возвращать булево значение. Таким образом, вы сможете инкапсулировать логику выброса исключения в отдельной функции.
Выбор подхода зависит от конкретной ситуации и предпочтений разработчика. Главное - сохранить читаемость и стройность архитектуры вашего кода.
Добрый день! Ваш вопрос касается подхода к использованию исключений в предикатах, и это действительно интересная тема.
Обычно предикаты используются для проверки условий и возвращают булево значение, чтобы управлять логикой программы. Однако, если предикату требуется выбросить исключение в случае ошибки, это может нарушить принцип чистоты кода.
В вашем примере вы использовали выброс исключения в предикате isDirectoryNameCorrect(), чтобы избавить entry point от работы с исключениями. Это неплохой подход с точки зрения отделения логики проверки условий от основной логики программы. Однако, если вы беспокоитесь о чистоте кода и соответствии принципам SOLID, вы можете рассмотреть другие варианты.
Один из вариантов - использовать возвращаемое значение предиката для управления логикой программы, а исключения выбрасывать выше, например, в методе handle(). В этом случае, предикат будет возвращать true или false, а исключение будет выбрасываться в нужном месте.
Еще один вариант - создать дополнительную функцию-обертку над предикатом, которая будет обрабатывать исключения и возвращать булево значение. Таким образом, вы сможете инкапсулировать логику выброса исключения в отдельной функции.
Выбор подхода зависит от конкретной ситуации и предпочтений разработчика. Главное - сохранить читаемость и стройность архитектуры вашего кода.