Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > ООП идеологический момент


Автор: Muchenik 23.10.2009, 20:31
Доброго времени суток. Возник небольшой спор по поводу мелочного момента при реализации модели.
Прошу высказать мнение с аргументацией по этому поводу.
Ситуация следующая, есть модель (Model), в которой реализованы методы валидации и добавление данных.
Есть две спорных реализации, типа
Вариант 1:
Код

class Model {
    private $_data = array();
    public function add($data)
    {
        $this->_data = $data;
        $this->_validateStep1();
        $this->_validateStep2();
        
        $this->_saveRecord(); /* private ф-ия, сохраняет данные $this->_data*/
    }
    
    protected function _validateStep1()
    {
        /*
        тут валидация и обработка $this->_data типа htmlspecialchars и тд.
        */
    }
}


Вариант 2:
Код

class Model {
    public function add($data)
    {
        $data = $this->_validateStep1($data);
        $data = $this->_validateStep2($data);
        
        $this->_saveRecord($data);
    }
    protected function _validateStep1($data)
    {
        /*
        тут валидация и обработка $data типа htmlspecialchars и тд.
        */
        return $data;
    }
}

Всем заренее спасибо.


Автор: solenko 23.10.2009, 22:56
Какое имеет отношение htmlspecialchars к валидации?
Зачем вообще htmlspecialchars на сохранении?
Зачем несколько шагов валидации?
Валидация -- процесс, которй ни коим образом не изменяет данные. Результат валидации -- булево значение либо exception в зависимости от религии.

Автор: Muchenik 24.10.2009, 00:34
Меня более интересует вопрос, как правильнее, хранить информацию в свойстве и обрабатывать ёё по ходу или передавать аргументом в методе, как показано на примере, после чего возвращать результат.

Сорри, наверно я не четко сформулировал вопрос.

Поэтому
Какое имеет отношение htmlspecialchars к валидации? - никакого, класс - это набросок для примера.
Зачем вообще htmlspecialchars на сохранении? - предпочитаю обрабатывать до сохранения. Не согласны?
Зачем несколько шагов валидации? - тут имел ввиду обработка данных в несколько шагов а не валидация.
Валидация -- процесс, которй ни коим образом не изменяет данные. Результат валидации -- булево значение либо exception в зависимости от религии. - спасибо знаю.


Автор: solenko 24.10.2009, 02:54
Цитата(Muchenik @  23.10.2009,  23:34 Найти цитируемый пост)
Меня более интересует вопрос, как правильнее, хранить информацию в свойстве и обрабатывать ёё по ходу или передавать аргументом в методе, как показано на примере, после чего возвращать результат.

Дело в том, что ООП придумали, чтобы программы сталее более логичными. О логичности сферического коня рассуждать трудно. Потому, либо приведите конкретный пример, либо не ждите конкретного ответа.

Цитата(Muchenik @  23.10.2009,  23:34 Найти цитируемый пост)
предпочитаю обрабатывать до сохранения. Не согласны?

Абсолютно не согласен. Данные -- святыня. Их нельзя портить.
Цитата(Muchenik @  23.10.2009,  23:34 Найти цитируемый пост)
тут имел ввиду обработка данных в несколько шагов а не валидация.

тогда почему валидация в примере?

Цитата(Muchenik @  23.10.2009,  23:34 Найти цитируемый пост)
Валидация -- процесс, которй ни коим образом не изменяет данные. Результат валидации -- булево значение либо exception в зависимости от религии. - спасибо знаю.

Тогда откуда такой пример?

Автор: youri 24.10.2009, 03:28
приведи кокретный пример шагов

Автор: MyDarkSide 9.11.2009, 11:16
С точки зрения православного ООП, должен быть сделан отдельный класс напр. Validator 
который должен содержать набор методов для проверки данных, и которые будут возвращать булево значение,
типа:
Код

Class Validator {
  static function is_phone();
  static function is_email();
  static function is_url();
}

 вызывать в моделе вот так: Validator::is_phone($data['phone']) 

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

protected $validate = array('phone' => 'is_phone' , 'web_site' => 'is_url'  ) ;  

а в базовый для всех моделей класс вынести метод, который будет вызывать соответствующую проверку, типа:
Код

Class Base_Model {
   function validate() {
       foreach($this->data as $k => $v) {
         $valid_method = $this->validate[$k]; // сильно упрощенный код просто для понятия логики
         if( ! Validator::$valid_method ($v) ) return false;
       
      }
      return true;
   }
}
 

Автор: Kevin 11.11.2009, 16:50
Strategy Pattern в поставленную задачу хорошо вписывается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)