Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Должен ли проверяющий метод check/validate возвращать boolean или выбрасывать исключение?

#php #рефакторинг #чистый_код


Этот вопрос не обязательно относится к PHP, просто это моя сфера.

При построении методов, которые "узнают" имеет ли объект/переменная что-то, разрешено
ли что-то (is, has, can), то возвращается true/false. Тут всё понятно. 

А если метод должен что-то проверить или свалидировать (check()/validate()), то что
должно быть? Должен ли метод вернуть булево значение, на основе которого мы поймём,
что что-то было некорректно? Или надо выбрасывать исключение (throw new InvalidDataExecption)
и метод валидации оборачивать в try/catch? Какой правильный подход?

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


Ответы

Ответ 1



Да как бы up to you. Может вам надо просто подсветить пропущенное при заполнении формы поле (тру/фолс). А может необходимо вывести дополнительное сообщение об ошибке (вот вам уже эррей). А где-то надо писать в лог ексепшены. Всё упирается в задачи, которые валидатор должен решать. имхо)

Ответ 2



Зависит от логики метода. Например у вас есть метод validateString, который принимает аргументом строку. И что-то в ней проверяет. Тогда логично сделать результат true или false в зависимости от результата проверки, а exception уже бросать в случае если на проверку пришел не тот тип данных. Другой пример. Если работа метода не возможна дальше, когда результат false, то тогда метод validateString возвращает true если проверка прошла, и бросаете exception если нет.

Ответ 3



С одной стороны конечно было бы круто получить сразу ответ на просьбу валидации данных, но сам по себе метод validate (по смыслу) должен просто что-то сделать. Как раз, как указал, check и validate похожи на void. С другой стороны, почему они что-то должны возвращать, если они походи на void. Поскольку, как сказано выше, все зависит от логики, то лично я бы предложил сформировать следующую логику: Формируется класс валидации, где есть метод validate, который выкидывает какие-то исключения (их надо будет отлавливать) В качестве обертки для случая true/false, я бы сделал метод isValid, который включал бы в себя try метода validate и делал return в случае успеха или неудачи Как вариант еще один метод, который валидировал бы все данные без выбрасывания исключений. Он бы копил ошибки, а затем возвращал их (или пустой массив, если все корректно). Таким образом, на одну только валидацию 3 реализации. Можно обернуть в абстрактный класс для дальнейшего использования. Ну тут уже персонально.

Комментариев нет:

Отправить комментарий