Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: использование непроинициализированного объекта
 
 автор: mechanic   (06.08.2008 в 12:48)   письмо автору
 
 

как можно спроектировать класс, чтоб сабж был невозможен?
например $user = new User; пустой объект, если вызвать $user->getName() - будет false
и как бы сразу не поймешь, что забыл вызвать для начала $user->init();, а в каждом методе писать
if(!$this->initialized) {throw new Exception...} неинтересно и неэлегантно

с getName() какой то простой пример получился, а вот в случае посложнее, когда перед использованием нужно сделать $user->setLogger(new Logger); чтоб объект вел логи, недопустимо пропускать инициализацию, ибо это приведет к фаталу при вызове методов несуществующего объекта $this->logger

  Ответить  
 
 автор: Axxil   (06.08.2008 в 12:51)   письмо автору
 
   для: mechanic   (06.08.2008 в 12:48)
 

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

  Ответить  
 
 автор: mechanic   (06.08.2008 в 12:55)   письмо автору
 
   для: Axxil   (06.08.2008 в 12:51)
 

но если перед ней надо выполнить setLogger, setErrorHandler и все такое
т.е. смысл инициализации - в законченности объекта, в том, чтоб разрешить использование объекта, только если все эти set-методы выполнены и объект "готов"

  Ответить  
 
 автор: Axxil   (06.08.2008 в 13:08)   письмо автору
 
   для: mechanic   (06.08.2008 в 12:55)
 

Не понял я.
Если вызовы setLogger, setErrorHandler обязательны, то почему их в конструктор не поместить?
Конструктор для этого и придуман, чтобы подготовить объект к использованию.

  Ответить  
 
 автор: mechanic   (06.08.2008 в 13:40)   письмо автору
 
   для: Axxil   (06.08.2008 в 13:08)
 

мне кажется нет смысла делать set-методы, которые будут вызываться в конструкторе с захардкоденным параметром ($this->setLogger(new Logger)), легче сразу написать $this->logger = new Logger; или передать $logger в конструктор и присвоить $this->logger = $logger;, а если параметров много?.. не хочется городить мегаконструкторы
смысл то этих методов в том, чтоб вызывать их снаружи, правильно ведь? зачем хардкодить в конструкторе
в общем тут чувствуется затык, и обычно это означает что у кого то проблемы в проектировании, и что на самом деле так никто не делает )
* ушел думать

  Ответить  
 
 автор: mechanic   (07.08.2008 в 16:41)   письмо автору
 
   для: mechanic   (06.08.2008 в 13:40)
 

додумалсо, тут можно заюзать паттерн Состояние (State)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования