PHP ООП: Избегайте одноэлементных/статических методов в шаблоне модели домена


Я понимаю важность внедрения зависимостей и его роль в модульном тестировании, поэтому следующая проблема заставляет меня задуматься:

Одна область, в которой я изо всех сил стараюсь не использовать Синглтон, - это шаблон карты идентификации/единицы работы (который отслеживает состояние объекта домена).

//Not actual code, but it should demonstrate the point    

class Monitor{//singleton construction omitted for brevity
    static $members = array();//keeps record of all objects
    static $dirty = array();//keeps record of all modified objects
    static $clean = array();//keeps record of all clean objects
}

class Mapper{//queries database, maps values to object fields
    public function find($id){
        if(isset(Monitor::members[$id]){
        return Monitor::members[$id];
    }
    $values = $this->selectStmt($id);
    //field mapping process omitted for brevity
    $Object = new Object($values);
    Monitor::new[$id]=$Object
    return $Object;
}

$User = $UserMapper->find(1);//domain object is registered in Id Map
$User->changePropertyX();//object is marked "dirty" in UoW

// at this point, I can save by passing the Domain Object back to the Mapper
$UserMapper->save($User);//object is marked clean in UoW

//but a nicer API would be something like this
$User->save();

//but if I want to do this - it has to make a call to the mapper/db somehow    
$User->getBlogPosts();

//or else have to generate specific collection/object graphing methods in the mapper
$UserPosts = $UserMapper->getBlogPosts();
$User->setPosts($UserPosts);

Какие-нибудь советы о том, как вы могли бы справиться с этой ситуацией?

Я бы не хотел передавать/генерировать экземпляры доступа к картографу/базе данных в сам объект домена, чтобы удовлетворить DI - В то же время, избегание этого приводит к большому количеству вызовов внешних статических методов внутри объекта домена.

Хотя я предполагаю, что если я хочу, чтобы "сохранить" было частью его поведения, то для этого в его конструкции требуется средство. Возможно, это проблема с ответственностью, объект домена не должен быть обременен сохранением. Это просто довольно удобная функция из шаблона активной записи - было бы неплохо реализовать ее каким-то образом.

Author: Matteo Riva, 2010-04-23

1 answers

То, что я делаю, хотя, возможно, и не лучший способ действий, - это иметь четкое соглашение об именовании для моих классов, FI: user_User - это объект домена, а user_mapper_User - это картограф.

В моем родительском классе domainObject я кодирую логику, чтобы найти его картограф.

Тогда у вас есть пара вариантов делегирования, очевидным из которых было бы использовать метод __call() в domainObject.

 1
Author: Javier Parra, 2010-04-23 14:56:51