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 :: Вопрос к матерым об общей идее конструкторов [2]
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Цитата:
использование исключений для бизнес логики - прямой путь к спагетти коду в частонсти целой этажерке проверок что за исключение
Чем отлов исключения принципиально добавляет макаронности той же самой проверке вернувшейся из функции переменной? вы реально считаете, что проверять на is_string, а потом парсить строку на содержание что бы понять, что с ней делать (логировать или пользователю выводить) удобнее чем отловить исключение, в котором будет код и тип ошибки помимо сообщения? Я правда не понимаю, о чем мы спорим
caballero
Отправлено: 21 Сентября, 2011 - 14:42:26
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
а потом парсить строку на содержание что бы понять, что с ней делать
Зачем парсить? Вы знаете что это ошибка при чем ошибка наперед известная (неверныая комбинация логина или пароля) вот и выводите
а пятиэтаэный
catch(...)
catch(...)
catch(...)
catch(...)
catch(...)
в каждой функции чем лучше
я уже не говорю как такую бизнес логику отлаживать
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Если ошибка наперед известная - то и катч будет тоже 1 ... вы явно пытаетесь отмазаться ))
MrBeard
Отправлено: 21 Сентября, 2011 - 14:50:19
Гость
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
caballero пишет:
Цитата:
а потом парсить строку на содержание что бы понять, что с ней делать
Зачем парсить? Вы знаете что это ошибка при чем ошибка наперед известная (неверныая комбинация логина или пароля) вот и выводите
а пятиэтаэный
catch(...)
catch(...)
catch(...)
catch(...)
catch(...)
в каждой функции чем лучше
если у вас одна ошибка(неверная комбинация логина и пароля), то и catch будет один.
А получение экземпляра класса User и его проверка в коде на принадлежность к этому классу вызывают недоумение.
Меня вообще с момента начала изучения слегка напрягает возможность возвращать смешанное значение в PHP, это подразумевает, что после вызова функции я должен ещё и проверять, что же она мне вернула... неприятно.
caballero
Отправлено: 21 Сентября, 2011 - 15:04:23
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
если у вас одна ошибка(неверная комбинация логина и пароля), то и catch будет один.
во первых не один - у вас могут быть иклблючения по работе с БД
во вторых что проще и читабельнее
if(_)
или
try{
...
}
catch{
}
Цитата:
А получение экземпляра класса User и его проверка в коде на принадлежность к этому классу вызывают недоумение.
вы проверяете не принадлежность а что это класс (можно использовать is_class) а не строка
или можно наоборот проверять что строка -
здесь два варианта и простой if
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
caballero пишет:
Цитата:
если у вас одна ошибка(неверная комбинация логина и пароля), то и catch будет один.
во первых не один - у вас могут быть иклблючения по работе с БД
если говорить про конкретно этот случай, то catch будет один, потому что обычно абсолютно всё равно, какая причина помешала пользователю залогиниться, результат один - в логине отказано. а если нужно обрабатывать разные ситуации, то catch будет больше, но и IF в вами предложенном решении будет больше ( в самом деле, не будете же вы писать пользователю, что у вас база данных померла.)
по поводу читаемости - тоже прихожу к мысли, что try{}catch{} становится читабельнее, потому что ожидаешь, где искать обработку ошибок, а не выискиваешь её в каждом встречном if.
и catch(SQLException e) выглядит, кстати, красивее, чем if(!is_class($variable) and $variable =="не удалось выполнить запрос");
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011 Откуда: Moscow
Помог: 0 раз(а)
caballero пишет:
Вообще в конструкторе не принято выполнять действия которые могут вызывть ошибку или исключение (ходить в базу например) - задача конструктора - проинициализировать члены класса.
И вот тут тоже что-то не понял.
А если объект это лютое сочетание 5-ти запросов к БД? Где мне все эти запросы делать?
Ну как пример: а что если это экземпляр скажем такого милого класса как "cisco"?
С бородой интерфейсов (которые ессно достаются из других таблиц) и таких не менее веселеньких экземпляров класса channel?
Где, как не в конструкторе их все инициализировать?
-------------------------------- -
Хотя идея со статикой ГУД! (Добавление)
caballero пишет:
чего оно неизвестное если это ваш код
Интуитивно хочется запихнуть всю сложную логику внутрь класса и забыть. А потом уже с "понтом под зонтом" экземплярами жонглировать.
Т.е. хочется только помнить что у каждого класса есть статический метод типа check который вернет либо обьект, либо сигнал о проблеме. Вопрос в том в каком виде этот сигнал получать. Хотелось бы конечно однообразия и однообразия академического.
caballero
Отправлено: 21 Сентября, 2011 - 15:26:17
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
если говорить про конкретно этот случай, то catch будет один, потому что обычно абсолютно всё равно, какая причина помешала пользователю залогиниться,
Не все равно
ошиька БД это одно
неверный пароль это другое
пароль верный но expired это третье
Цитата:
А если объект это лютое сочетание 5-ти запросов к БД? Где мне все эти запросы делать?
В методе логин и делаете где же еще? Этот метод выполняет конкретную функцию в бизнес-логике. Количество запросов не имеет значения
Цитата:
Где, как не в конструкторе их все инициализировать?
если кроме инициализации переменных класса - то есть присвоения им значения производятся еще какието действия вычисления и т.д. тогда конечно нужен конструктор
в данном случае речь шла о присвоении полей таблицы БД полям класса (Добавление)
Цитата:
Т.е. хочется только помнить что у каждого класса есть статический метод типа check который вернет либо обьект, либо сигнал о проблеме.
да, только сигнал это не исключение которое будет поймано неизвестно где
а если оно поймано тут же то на фига оно надо если можно обойтись IF
Цитата:
Хотелось бы конечно однообразия и однообразия академического.
нужно пользоватсыя здравым смыслом и пракьтическим опытом а н не выкладками теоретиков (Добавление)
Это PHP приучает так писать безалаберно
писали бы вы на С++ такие ноимера бы не прошли
выкинули исключение с класса а класс остался в памяти
(знаменитая memory leak)
через пару дней бы сервер остался без памяти а еще пару дней бы ушло найти где проблемма
Покинул форум
Сообщений всего: 97
Дата рег-ции: Авг. 2011
Помог: 2 раз(а)
Цитата:
Это PHP приучает так писать безалаберно
писали бы вы на С++ такие ноимера бы не прошли
выкинули исключение с класса а класс остался в памяти
(знаменитая memory leak)
через пару дней бы сервер остался без памяти а еще пару дней бы ушло найти где проблемма
это значит, что исключения развивают безолаберность, а нетипизированность возврата функций - наоборот, ведёт к духовному и профессиональному росту?)
Mad_Alex
Отправлено: 21 Сентября, 2011 - 15:39:38
Новичок
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011 Откуда: Moscow
Помог: 0 раз(а)
caballero пишет:
да, только сигнал это не исключение которое будет поймано неизвестно где а если оно поймано тут же то на фига оно надо если можно обойтись IF
Не, с мнением что исключение это не гуд в данном случае я согласен.
Наверное ОБЩИМ для всего можно признать принцип: если статик класса вернул что-то типа "не экземпляр" то значит бяда, что-то не так.
caballero пишет:
в данном случае речь шла о присвоении полей таблицы БД полям класса
К сожалению у меня такое только в виде счастливого исключения будет встречаться.
caballero
Отправлено: 21 Сентября, 2011 - 15:40:43
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
И не надо давать методам дурацкие названия типа check или valid
Логин есть login понятно что он делает
Покинул форум
Сообщений всего: 28
Дата рег-ции: Сент. 2011 Откуда: Moscow
Помог: 0 раз(а)
caballero пишет:
если говорить про конкретно этот случай, то catch будет один, потому что обычно абсолютно всё равно, какая причина помешала пользователю залогиниться,
Не все равно
ошиька БД это одно
неверный пароль это другое
пароль верный но expired это третье
+100500!!
Причем логин юзера это случай "детский".
caballero
Отправлено: 21 Сентября, 2011 - 15:44:14
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
если статик класса вернул что-то типа "не экземпляр" то значит бяда, что-то не так.
Да, но что именна за бяда вы уже знаете метод уже это определил тут ничего не надо делать просто вернуть сообщение клиенту
это не исключительная ситуация
Цитата:
К сожалению у меня такое только в виде счастливого исключения будет встречаться.
Скорее всего это результат неудачной архитектуры
Но никаких проблем нет
собсвенно никто не мешает пользоватся и конструкторами и прямым присвоением
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.