Звучит вполне разумно, если в этом случае выдается исключение.Метод, который должен делать одно и только одно, просто пытается извлечь запись пользователя из базы данных.Если предварительное условие не выполняется, сдавайтесь.Если ошибки базы данных, сдаваться.Если пользователь не найден, сдавайтесь.Пусть вызывающий код справится с последствиями.
Исключением является вполне приемлемый путь выхода для метода.
В случае предварительного условия метод не несет ответственности за исправление этого.Это ответственность вызывающего кода.Так что выведите ArgumentException
некоторого вида и позвольте вызывающему коду разобраться с ним.
В случае ошибки базы данных, либо перехватите ее, либо сгенерируйте пользовательское исключение (что-то вроде InfrastructureFailed
исключения)приложение для обработки соответственно.В основном, приложение должно сообщить пользователю о технических проблемах и повторить попытку позже.
В случае, если пользователь не найден, это звучит как неудачный вход в систему.Бросьте какой-нибудь SecurityException
и позвольте вызывающему приложению обработать его, уведомив пользователя о том, что вход в систему не удался.(Не будьте более конкретны. Например, не говорите пользователю, что имя пользователя было в порядке, но пароль был неверным. Это дает злоумышленнику больше информации, чем вы хотите, чтобы он имел. Просто скажите, что вход не выполнен, ничегоподробнее.)
Вы также упоминаете случай, когда пароль слишком короткий.Я полагаю, что это то, что должно быть проверено, прежде чем он достигнет этой точки.В этом случае это относится к проверке входных данных для метода.Таким образом, предварительные условия не выполняются, и метод даже не пытается добраться до базы данных.Но «пароль слишком короткий», вероятно, не является хорошей ошибкой, чтобы сообщить пользователю при входе в систему.Скорее, это когда они пытаются создать пароль.
Одна вещь, которую вы не должны делать, это возвращать нулевой или пустой пользовательский объект или что-то в этом роде.Это накладывает ответственность на вызывающий код, чтобы проверить, была ли ошибка.Исключения являются совершенно допустимым способом уведомления вызывающего кода об ошибке.Возвращаемый «магический объект» подобен любой другой «магической строке» в коде, но хуже, потому что он вытекает из метода и в другой код.
Теперь это не всегда полное правило,конечно.Это зависит от структуры приложения.Например, если это веб-служба или какой-либо другой тип системы запросов / ответов, вы можете захотеть иметь стандартный объект ответа, который будет указывать на сбой.Это предполагает некоторый прикладной контекст вокруг метода.И в этом случае вы, вероятно, должны по-прежнему иметь дело с несколькими методами.Внутренний (метод доменной логики) будет генерировать исключение, а внешний (метод приложения с поддержкой UX) будет перехватывать исключение и создавать соответствующий ненулевой ответ на пользовательский интерфейс.
Как вы handle исключение зависит от логической структуры вашего приложения.Но выброс и перехвата исключений (имейте в виду, что «перехват» - это не то же самое, что осмысленно «обработка») - вполне приемлемое поведение.