#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 реализации. Можно обернуть в абстрактный класс для дальнейшего использования. Ну тут уже персонально.
Комментариев нет:
Отправить комментарий