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 :: дискуссии по теме

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): [1] 2 3 4 5 »   

> Без описания
DlTA
Отправлено: 28 Октября, 2011 - 10:27:35
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
функция должна всегда возвращать результат строго одного типа или же null, не должно быть так, чтобы когда-то она возвращала false, когда-то массив


почему? это же удобно

snikers987 пишет:
чем удобно? если не понятно какое значение вернет функция, с которым дальше нужно както работать, писать кучу проверок что вернула функция, а потом только работать с результатом?

К примеру скрипт ждет что функция вернет bool , а она ему возвращает массив, это по Вашему удобно?

Поправьте если не прав. ИМХО


DeepVarvar пишет:
Вы арендуете вагоны.
В этот раз вы заказали 10 вагонов (array).
Вы ожидаете 10 вагонов.
Приезжает пустой тепловоз (null).

Если судить по вашему, то:
Даже если вагонов нет, всеравно должны быть вагоны.
Хоть один... Ну хоть старый и ржавый... (array).
Где их взять то?


-------------------------------- -------------------------------- ----

snikers987 пишет:
чем удобно? если не понятно какое значение вернет функция

почему не известно
если функция отработала нормально то возвращает массив(например)
если же имеется некая ошибка (входных, связи, ...) то возвращает false
в итоге взглянув лишь на результат я могу прекратить дальнейшую обработку участка.
(Добавление)
к примеру
mysql_query
возвращает или указатель или false

это плохо??
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 10:43:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




PHP нетипизированный язык функция может возвращать что угодно
главное написать нормальный комент или задокументировать ЧТО и в КАКИХ случаях она возвращает


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 28 Октября, 2011 - 10:52:19
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Функция должна возвращать только один тип данных либо null.
Если же происходит что-то исключительное (не соединились с БД/не хватило данных и т.п.) - нужно вызывать Exception
Ваш "пустой вагон" и есть null-значение.

Почему так? Потому что всегда можно быть уверенным, что множество операций, применимое к результату функции, будет одинаково. Потому что всегда можно будет знать, что если функция возвращает объект определенного класса, то она и вернет, и у него будут соответствующие методы.

Это - не "строгое правило", это скорее стандарт "хорошего тона программирования". Придерживаться его или нет - каждый решает сам.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 28 Октября, 2011 - 11:25:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
Функция должна возвращать только один тип данных либо null.
Если же происходит что-то исключительное (не соединились с БД/не хватило данных и т.п.) - нужно вызывать Exception

как то громоздко получается

к примеру если на входе не валидные данные
функция генерит Exception, посему для валидной обработки вызов функции надо брать в
try catch

хотелось бы узнать по больше о негласных правилах, и желательно с примерами.
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Октября, 2011 - 11:27:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen однако в некоторых случаях все же удобнее вернуть "дефолтный" вагон вместо null,
дабы не проверять там, куда вернули, и не устанавливать после этого дефолт.
Но это довольно редкая ситуация.
 
 Top
EuGen Администратор
Отправлено: 28 Октября, 2011 - 11:32:46
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Но согласитесь, гораздо удобнее написать
PHP:
скопировать код в буфер обмена
  1. try
  2. {
  3.     $rResult=func();
  4. }
  5. catch(Exception0 $e)
  6. {
  7.    //handle $e
  8. }
  9. catch(Exception1 $e)
  10. {
  11.    //handle $e
  12. }
  13. //...

Чем догадываться о том, в каком случае функция вернет int, в каком - false и в каком array и т.п.
Это не громоздко - это создает то, что называется интерфейсом (точнее, его прообраз, так как это понятие применимо все же к классам)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Октября, 2011 - 11:40:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
Exception
Я кстати оочень редко вижу такие написания..
Везде в исходниках сайтов if .. elseif .. else.
 
 Top
DlTA
Отправлено: 28 Октября, 2011 - 11:41:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
Но согласитесь, гораздо удобнее написать...

ну это скорее локальные стандарты, лично я с подобным прежде не встречался

например подобный функционал реализовывал следующим образом
PHP:
скопировать код в буфер обмена
  1. $rResult=func(&$msassage='');
  2. if($rResult===false)
  3. {
  4.   // $msassage; // обработка сообщения
  5. }


и чтоб уточнить, вопрос не в том что функция возвращает все подряд
а именно либо результат либо false и что в этом плохого
 
 Top
EuGen Администратор
Отправлено: 28 Октября, 2011 - 11:48:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Хорошо, тогда так - предположим, я не знаю как именно реализована функция, есть лишь некоторое описание, которое говорит о том, что функция "возвращает false в случае неудачи".
Во-первых, что за неудача произошла? false Вам об этом не расскажет, тогда как $e->getMessage() или например $e->getTrace() - расскажет.
Во-вторых, если есть несколько случаев, когда происходит "неудача". В один false это не уместить - нужно придумывать возврат int или прочие странности.
В-третьих,

я могу написать лишь только тогда. когда знаю, что func() всегда мне вернет объект, у которого есть метод method()


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Октября, 2011 - 11:50:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen я так подозреваю, что обработчики исключений доступны глобально, и именно в этом удобство?
 
 Top
EuGen Администратор
Отправлено: 28 Октября, 2011 - 11:53:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
EuGen я так подозреваю, что обработчики исключений доступны глобально

Доступны. И Вы можете их определять самостоятельно. Удобство не именно (то есть не только) в этом - в чем еще я уже описал - мне не нужно знать что там происходит внутри функции, я всегда уверен что будет за результат и обработку ошибок можно перепоручить специальному обработчику.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 28 Октября, 2011 - 11:58:36
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




В том топике, из которого цитаты, я задавал вполне конкретный вопрос, но ответа так и не получил. Я просил написать код, который бы был построен по вашим принципам (возвращаю что хочу, но исключениями не пользуюсь) и реализовывал несложную логику. Если вы прочтете весь топик, из которого цитируете, вы сможете посмотреть на мой вопрос и попытаться ответить, тогда, возможно, вы поймете, в чем неудобство.
 
My status
 Top
DlTA
Отправлено: 28 Октября, 2011 - 12:21:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Stierus, вот исходная тема, не могу найти поста от вас.
 
 Top
Stierus Супермодератор
Отправлено: 28 Октября, 2011 - 12:30:47
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Сори, это не та тема. Был топик, посвященный исключительно вашему вопросу.

Я там попросил написать 1 функцию, которая на входе получала id пользователя и пароль, на основании этих данных она бы возвращала информацию о пользователе из базы данных. Возможные ошибки: отсутствие соединения с базой данных, пустые логоин или пароль, неверные логин или пароль (явная муть, не прошедшая валидацию), несуществующий пользователь (информация прошла валидацию, но пользователя, который бы соответсвовал ей - не существует).

Обработка ошибок: если незаполнены или неверные поля - вывести сообщение пользователю, если нет соединения с бд - отправить письмо админу. Если запрошен несуществующий пользователь - добавить в файл с логом сообщение (содержимое не важно)


Это вполне адекватная задача, встречающаяся сплошь и рядом, я не прошу реализовывать этот функционал полностью, мне интересно, в каких случаях что вернет ваша функция и как этот возврат будет обрабатывать вызывающая сторона.
 
My status
 Top
DlTA
Отправлено: 28 Октября, 2011 - 12:41:58
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Stierus пишет:
мне интересно, в каких случаях что вернет ваша функция и как этот возврат будет обрабатывать вызывающая сторона.


в принцыпе понятно, вещать весь функционал на функцию не корректно
ибо вшивать в одну функцию где искть админа, что у нас из себя лог файл и т.д. грозит большими копипистами
а при изменении большими модификациями

отвечая на поставленный вопрос вполне могу извратиться и предложить достаточно работающий вариант
но читая данную тему желание использовать исключения все сильнее

Спойлер (Отобразить)

(Добавление)
а как в формате PhpDoc указать возможные исключения
и нету ли тут ошибки (Отобразить)

описывается исключение ExceptionDBQuery а вызывается Exception($query, mysql_errno(), mysql_error())
 
 Top
Страниц (5): [1] 2 3 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB