Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
EuGen пишет:
функция должна всегда возвращать результат строго одного типа или же null, не должно быть так, чтобы когда-то она возвращала false, когда-то массив
почему? это же удобно
snikers987 пишет:
чем удобно? если не понятно какое значение вернет функция, с которым дальше нужно както работать, писать кучу проверок что вернула функция, а потом только работать с результатом?
К примеру скрипт ждет что функция вернет bool , а она ему возвращает массив, это по Вашему удобно?
Поправьте если не прав. ИМХО
DeepVarvar пишет:
Вы арендуете вагоны.
В этот раз вы заказали 10 вагонов (array).
Вы ожидаете 10 вагонов.
Приезжает пустой тепловоз (null).
Если судить по вашему, то:
Даже если вагонов нет, всеравно должны быть вагоны.
Хоть один... Ну хоть старый и ржавый... (array).
Где их взять то?
чем удобно? если не понятно какое значение вернет функция
почему не известно
если функция отработала нормально то возвращает массив(например)
если же имеется некая ошибка (входных, связи, ...) то возвращает false
в итоге взглянув лишь на результат я могу прекратить дальнейшую обработку участка. (Добавление)
к примеру mysql_query
возвращает или указатель или false
это плохо??
caballero
Отправлено: 28 Октября, 2011 - 10:43:39
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
PHP нетипизированный язык функция может возвращать что угодно
главное написать нормальный комент или задокументировать ЧТО и в КАКИХ случаях она возвращает
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Функция должна возвращать только один тип данных либо null.
Если же происходит что-то исключительное (не соединились с БД/не хватило данных и т.п.) - нужно вызывать Exception
Ваш "пустой вагон" и есть null-значение.
Почему так? Потому что всегда можно быть уверенным, что множество операций, применимое к результату функции, будет одинаково. Потому что всегда можно будет знать, что если функция возвращает объект определенного класса, то она и вернет, и у него будут соответствующие методы.
Это - не "строгое правило", это скорее стандарт "хорошего тона программирования". Придерживаться его или нет - каждый решает сам.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DlTA
Отправлено: 28 Октября, 2011 - 11:25:59
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
EuGen пишет:
Функция должна возвращать только один тип данных либо null.
Если же происходит что-то исключительное (не соединились с БД/не хватило данных и т.п.) - нужно вызывать Exception
как то громоздко получается
к примеру если на входе не валидные данные
функция генерит Exception, посему для валидной обработки вызов функции надо брать в try catch
хотелось бы узнать по больше о негласных правилах, и желательно с примерами.
DeepVarvar
Отправлено: 28 Октября, 2011 - 11:27:40
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen однако в некоторых случаях все же удобнее вернуть "дефолтный" вагон вместо null,
дабы не проверять там, куда вернули, и не устанавливать после этого дефолт.
Но это довольно редкая ситуация.
Чем догадываться о том, в каком случае функция вернет int, в каком - false и в каком array и т.п.
Это не громоздко - это создает то, что называется интерфейсом (точнее, его прообраз, так как это понятие применимо все же к классам)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 28 Октября, 2011 - 11:40:32
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen пишет:
Exception
Я кстати оочень редко вижу такие написания..
Везде в исходниках сайтов if .. elseif .. else.
и чтоб уточнить, вопрос не в том что функция возвращает все подряд
а именно либо результат либо false и что в этом плохого
EuGen
Отправлено: 28 Октября, 2011 - 11:48:23
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Хорошо, тогда так - предположим, я не знаю как именно реализована функция, есть лишь некоторое описание, которое говорит о том, что функция "возвращает false в случае неудачи".
Во-первых, что за неудача произошла? false Вам об этом не расскажет, тогда как $e->getMessage() или например $e->getTrace() - расскажет.
Во-вторых, если есть несколько случаев, когда происходит "неудача". В один false это не уместить - нужно придумывать возврат int или прочие странности.
В-третьих,
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
DeepVarvar пишет:
EuGen я так подозреваю, что обработчики исключений доступны глобально
Доступны. И Вы можете их определять самостоятельно. Удобство не именно (то есть не только) в этом - в чем еще я уже описал - мне не нужно знать что там происходит внутри функции, я всегда уверен что будет за результат и обработку ошибок можно перепоручить специальному обработчику.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Stierus
Отправлено: 28 Октября, 2011 - 11:58:36
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
В том топике, из которого цитаты, я задавал вполне конкретный вопрос, но ответа так и не получил. Я просил написать код, который бы был построен по вашим принципам (возвращаю что хочу, но исключениями не пользуюсь) и реализовывал несложную логику. Если вы прочтете весь топик, из которого цитируете, вы сможете посмотреть на мой вопрос и попытаться ответить, тогда, возможно, вы поймете, в чем неудобство.
DlTA
Отправлено: 28 Октября, 2011 - 12:21:02
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
Stierus, вот исходная тема, не могу найти поста от вас.
Stierus
Отправлено: 28 Октября, 2011 - 12:30:47
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Сори, это не та тема. Был топик, посвященный исключительно вашему вопросу.
Я там попросил написать 1 функцию, которая на входе получала id пользователя и пароль, на основании этих данных она бы возвращала информацию о пользователе из базы данных. Возможные ошибки: отсутствие соединения с базой данных, пустые логоин или пароль, неверные логин или пароль (явная муть, не прошедшая валидацию), несуществующий пользователь (информация прошла валидацию, но пользователя, который бы соответсвовал ей - не существует).
Обработка ошибок: если незаполнены или неверные поля - вывести сообщение пользователю, если нет соединения с бд - отправить письмо админу. Если запрошен несуществующий пользователь - добавить в файл с логом сообщение (содержимое не важно)
Это вполне адекватная задача, встречающаяся сплошь и рядом, я не прошу реализовывать этот функционал полностью, мне интересно, в каких случаях что вернет ваша функция и как этот возврат будет обрабатывать вызывающая сторона.
DlTA
Отправлено: 28 Октября, 2011 - 12:41:58
Постоянный участник
Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010
Помог: 53 раз(а)
Stierus пишет:
мне интересно, в каких случаях что вернет ваша функция и как этот возврат будет обрабатывать вызывающая сторона.
в принцыпе понятно, вещать весь функционал на функцию не корректно
ибо вшивать в одну функцию где искть админа, что у нас из себя лог файл и т.д. грозит большими копипистами
а при изменении большими модификациями
отвечая на поставленный вопрос вполне могу извратиться и предложить достаточно работающий вариант
но читая данную тему желание использовать исключения все сильнее
Как должно быть известно, функции могут вызывать другие функции, те в свою очередь третьи и т.п. При этом в программе образуется стек функций. В случае возникновения исключения вне блока try, текущая функция завершается и управление передается обратно в вызвавшую. Если вызов функции происходил в блоке try - происходит обработка, если вне - данная функция также завершается и управление передается уже в вызвавшую её. Таким образом стек функций разматывается назад в поисках блока-перехватчика (try). Если домотали до самого верха, не встретив try, происходит обработка по умолчанию - завершение сценария с выводом сообщения об ошибке.
(Добавление)
а как в формате PhpDoc указать возможные исключения
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.