PHP OOP: Избегайте одноэлементных / статических методов в шаблоне модели предметной области - PullRequest
3 голосов
/ 23 апреля 2010

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

Одной из областей, в которой я стараюсь не использовать Singleton, является шаблон «Карта идентичности / единица работы» (который отслеживает состояние объекта домена).

//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. В то же время, избегая этого, можно было бы вызвать множество вызовов внутри объекта домена к внешним статическим методам. *

Хотя я предполагаю, что если я хочу, чтобы «сохранение» было частью его поведения, то для его создания требуется средство, позволяющее это сделать. Возможно, это проблема ответственности. Доменный объект не должен быть обременен сохранением. Это просто отличная особенность шаблона Active Record - было бы неплохо реализовать его каким-то образом.

1 Ответ

1 голос
/ 23 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...