Проектирования класса регистрации

Redjik

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

PHP:
abstract class loginRegister{
    
    private $mail;
   
    /**
     * @var dbLogRegAbstract 
     */
    private $db;
    
    /**
     * @var userLogRegAbstract 
     */
    public $user;
    
    /**
     * @var sessionLogRegAbstract 
     */
    public $sesion;
      
    public function init() {        
        
        $this->session = $this->getSession();
        $this->db = $this->getDbObj();
        if ($this->sesion){
            $this->user = $this->getUserFromSession();
        }

    }
    
    abstract public function getDbObj();
    
    abstract public function getMailObj();
    
    abstract public function getSession();

    public function login($login,$password){
        $validator = LogRegValidator::getInstance()->checkLogin($login);
        $validator->checkString($password);
        if (!$validator->errors()){
            $this->getUser($login);            
        }
        
    }
    
    public function register(){
        
        
    }
    
    public function passrecover(){
        
    }
    

    public function getUserFromSession(){
           $this->user = $this->db->getUserByKey($this->session);
           return $this->user;
    }


    public function getUser($login){
       $this->user = $this->db->getUser($login);
       return $this->user;
    }
    
}
И да - следующим этапом я посмотрю как сделано в зенде и перепишу его.
 

AmdY

Пью пиво
Команда форума
а почему ты не захотел в init прям инджектить зависимости init(Session_Interface $session, Db_Interface $db)
 

Redjik

Джедай-мастер
а потом в конструкторе наследуемого класса сразу объекты инстанциировать и init() вызывать?
 

AmdY

Пью пиво
Команда форума
да, либо инстанцировать, либо взять уже инстанцированные и передать ему. собственно в этом и фишка, что ты можешь передать что угодно, главное, чтобы соответствовало интерфейсу. а вот в случае LogRegValidator::getInstance() у тебя валидатор жёстко зашит в класс.
только, если в классе loginRegister они используются много где, то лучше инъекцию делать прямо в конструктор.
 

Redjik

Джедай-мастер
Написал примерно 70 процентов, думаю сегодня закончу, нужно еще комментарии в более-менее бжеский вид привести.
Куда лучше выложить для критики/советов - git или архивом?
 

Ragazzo

TDD interested
Иван Redjik Матвеев
А что такое *LogRegAbstract поля? А если нужно доставать данные не только через сессию у пользователя? Вот у symfony подробнее описано.
Лучше git)
 

Redjik

Джедай-мастер
Я подобное и хотел сделать - просто назвал не так. В итоге правда получилось только абстрактная бд, думаю после конструктивной критики я подвергну всю систему рефакторингу. + очень любопытно будет узнать, дошел я до уровня миддл.

ЗЫ. Еще дописываю, пол дня занимался. Искренне надеюсь, что завтра закину.
 

AmdY

Пью пиво
Команда форума
Иван Redjik Матвеев
ты бы для тренировки и писал бы итерациями с несколькими рефаторингами, тогда в диффах было бы просматривать шаблоны рефакторинга, сколько времени тратится и сколько кода нужно дописать. в реальных проектах важно чувствовать, когда дальше рефакторить бессмысленно и экономически нецелесообразно или когда ООПизм и паттернизация начинают жать..
 

Redjik

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

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

В следующий раз все нарисуе UML ками
 

Redjik

Джедай-мастер
в этом, кстати, TDD отличный учитель
знаю, как свободное время будет - сделаю уроки по созданию фрейма на основе классов symfony, baev ссылку скидывал, там как раз TDD, который мне (на данном уровне) более-менее понятен (именно логикой - зачем это надо и почему) в отличие от книги по yii - agile development, в которой - стоит отметить - все очень логично разбито по итерациям, но вот TDD я части пропускал (просто не мог понять - зачем оно тут нужно)
 
Сверху