Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вопрос к матерым об общей идее конструкторов
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011 Откуда: Moscow
Помог: 0 раз(а)
Собственно стою перед большим проектом.
Нужно решить один вопрос: ГДЕ проверять корректность ввода данных? ДО конструктора или В конструкторе?
И придерживаться этого принципа.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Правильнее поручить валидацию специальному классу (валидатору), а непосредственно саму логику обработки оставить отдельно.
То есть алгоритмически:
0. Пользователь вводит данные
1. Создается объект-валидатор и проверяется корректность данных
2. Если (1) отвечает, что данные в порядке, то далее создается объект-обработчик, который что-то делает с данными. Если (1) отвечает, что есть ошибка - о ней сообщается и происходит возврат к (0)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
MrBeard
Отправлено: 21 Сентября, 2011 - 09:18:08
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
EuGen пишет:
Правильнее поручить валидацию специальному классу (валидатору), а непосредственно саму логику обработки оставить отдельно.
То есть алгоритмически:
0. Пользователь вводит данные
1. Создается объект-валидатор и проверяется корректность данных
2. Если (1) отвечает, что данные в порядке, то далее создается объект-обработчик, который что-то делает с данными. Если (1) отвечает, что есть ошибка - о ней сообщается и происходит возврат к (0)
вопрос по теме - а если существует некое большое количество классов с иерархией, входящие данные для которых различны, и проверки на валидность, соответственно, тоже, то на каждый такой класс нужно городить отдельный класс-валидатор, или создать царь-класс-валидатор, который будет иметь кучу методов проверки на каждый пользовательский класс, или всё же лучше в классах создать метод типа
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Как правило, использовать только "царь-класс" неудобно и нецелесообразно. Я поступаю так - у меня действительно есть базовый класс-валидатор, однако же содержит он лишь общие методы проверки данных, которые с большой вероятностью, будут встречаться широко. А специфичные валидаторы наследуются от него и, возможно, переопределяют при наследовании некоторые его методы.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 21 Сентября, 2011 - 10:38:56
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Проверять валидность в конструкторе - абсурд. Ты создаешь екземпляр класса
разумеется уж валидного. Если ты проверяешь в конструкторе ты УЖЕ создал экземпляр. А если он не валидный и что - прибивать его?
Вообще в конструкторе не принято выполнять действия которые могут вызывть ошибку или исключение (ходить в базу например) - задача конструктора - проинициализировать члены класса.
Плодить иерархию валидаторов - это значит писать "индусский" код и противоречить принципу инкапсуляции.
Самое грамотное - создать в классе СТАТИЧЕСКИЙ метод который будет валидировать данные и возвращать екземпляр класса или там null или false или исключение выбрасывать. Тем более что статический метод будет иметь доступ к приватным членам класса. Да и не нужны в большинстве случаев специфические валидаторы.
В случае с юзером - статический метод login(name,pass)
либо возвращает екземпляр юзера после проверки в БД, либо например строку с описанием ошибки.
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
caballero пишет:
Проверять валидность в конструкторе - абсурд. Ты создаешь екземпляр класса
разумеется уж валидного. Если ты проверяешь в конструкторе ты УЖЕ создал экземпляр. А если он не валидный и что - прибивать его?
Вообще в конструкторе не принято выполнять действия которые могут вызывть ошибку или исключение (ходить в базу например) - задача конструктора - проинициализировать члены класса.
Плодить иерархию валидаторов - это значит писать "индусский" код и противоречить принципу инкапсуляции.
Самое грамотное - создать в классе СТАТИЧЕСКИЙ метод который будет валидировать данные и возвращать екземпляр класса или там null или false или исключение выбрасывать. Тем более что статический метод будет иметь доступ к приватным членам класса. Да и не нужны в большинстве случаев специфические валидаторы.
В случае с юзером - статический метод login(name,pass)
либо возвращает екземпляр юзера после проверки в БД, либо например строку с описанием ошибки.
я просто почему спрашивал... видел достаточно кода(на яве или шарпах), где проверка валидности данных проходила исключительно внутри класса объекта, и при некорректности просто бросалось исключение, в том числе при первичном заполнении пустого объекта. А во внешнем коде ни о каких проверках уже не было и речи.
С другой стороны, я читал где то о проектировании приложения так, что все данные проверяются сразу на входах, а внутри приложения проходят ТОЛЬКО валидные данные, которые больше нигде не проверяются.
Вот и хотел узнать, как в PHP удобнее или правильнее поступать)
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011 Откуда: Moscow
Помог: 0 раз(а)
caballero пишет:
Самое грамотное - создать в классе СТАТИЧЕСКИЙ метод который будет валидировать данные и возвращать екземпляр класса или там null или false или исключение выбрасывать. Тем более что статический метод будет иметь доступ к приватным членам класса. Да и не нужны в большинстве случаев специфические валидаторы.
В случае с юзером - статический метод login(name,pass)
либо возвращает екземпляр юзера после проверки в БД, либо например строку с описанием ошибки.
Итак получится что-то такое? Сорь если напишу глупость.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
я просто почему спрашивал... видел достаточно кода(на яве или шарпах), где проверка валидности данных проходила исключительно внутри класса объекта, и при некорректности просто бросалось исключение, в том числе при первичном заполнении пустого объекта.
Ну, всякj люди пишут. В принципе если выбрысывать исключение то можно - тогда сборщик мусора сам уберет недоделанный класс. Но такой подход тоже некорректен. исключения должны выбрасыватся в ИСКЛЮЧИТЕЛЬНЫХ ситуациях. Например - ошибка соединения с БД или еще чего. Проверка на валидность - это бизнес-логика. Выбрасывать исключение потому что неверный логин - моветон.
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
caballero, я с вами не согласен в последнем вопросе Ф-я должна иметь четкий api и если она возвращает объект класса user - то возвращать false в хз каких ситуациях - это истинный моветон. Этот false не дает понять, почему он вернулся - нет такого пользователя или пароль не подошел или база упала ... из за чего false ? Так что если возвращается объект - должен возвращаться либо он, либо null, никаких смешений типов не допускается, а все ситуации, когда user не может быть отдан - должны вызывать exception соответствующего типа.
по поводу проверки - очень часто узнать, как валидировать переменную, знает только класс, которому она нужна - именно поэтому валидации, зачастую, внутри классов.
caballero
Отправлено: 21 Сентября, 2011 - 14:00:42
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
caballero, я с вами не согласен в последнем вопросе Ф-я должна иметь четкий api и если она возвращает объект класса user - то возвращать false в хз каких ситуациях - это истинный моветон. Этот false не дает понять, почему он вернулся - нет такого пользователя или пароль не подошел или база упала ... из за чего false ? Так что если возвращается объект - должен возвращаться либо он, либо null, никаких смешений типов не допускается, а все ситуации, когда user не может быть отдан - должны вызывать exception соответствующего типа.
Самое простое возвращать строку с описанием ошибки (null ничем не лучше false)
Смешение типов в PHP нормально - это нетипизированный язык
а вот исключения там где можно сделать нормальную обработку как раз не лучшее решенире
Цитата:
Чем статический метод предпочтительнее конструктора на большом количестве полей?
тем что вы берете данные и прямо присваиваете их членам класса
не нужно писать конструктор с десятком параметром а потом в конструкторе десяток переприсвоений этих параметров внутренним переменным
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
Самое простое возвращать строку с описанием ошибки (null ничем не лучше false)
null - это пустое значение, тоесть ничего не найдено, false - логическое нет ... разница в подсветке ide, декларации интерфейсов (проверка соответствия интерфейсу), правильном заполнении phpdoc
пример практический:
interfase в вакууме
function test(tesClass $class);
так вот если в ф-ю test передать false - будет плохо, если null - вполне нормальная ситуация (Добавление)
exception - исключительная ситуация. При попытке авторизации ваш логин заранее фигня, я даже пробовать не буду его авторизовывать - это и есть исключительная ситуация, сама ф-я не знает, что с ней сделать, она кидает badloginException, а что с ним будет делать вызывающая ф-я - ее не волнует. вызывающая ф-я может вывести сообщение пользователю, может записать в логи или отправить письмо администратору - да хоть 404 выдать - функция логина не должна об этом думать, но проинформировать вызывающую сторону она обязана - это она и делает с помощью исключений.
EuGen
Отправлено: 21 Сентября, 2011 - 14:13:43
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
caballero пишет:
Смешение типов в PHP нормально
Если Вы желаете писать в хорошем стиле, этого следует избегать. В таком случае Вы всегда будете знать что ожидать от того или иного метода класса.
Возвращать непонятно что - плохо, лучше всегда использовать возможность вызвать исключение.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
caballero
Отправлено: 21 Сентября, 2011 - 14:27:32
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
сли Вы желаете писать в хорошем стиле, этого следует избегать. В таком случае Вы всегда будете знать что ожидать от того или иного метода класса.
я и так знаю что от него ожидать это программа а не лотерея.
Цитата:
Возвращать непонятно что - плохо, лучше всегда использовать возможность вызвать исключение.
Не непонятно что а вполне определенные изветсные наперед значения
либо клас User проверяем instance of
либо строку
использование исключений для бизнес логики - прямой путь к спагетти коду в частонсти целой этажерке проверок что за исключение
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.