2010-07-05 6 views
3

Я не уверен, что название - лучший способ описать этот вопрос.Единица работы шаблона, геттеры, сеттеры и контракты (PHP)

Эта книга - http://apress.com/book/view/9781590599099 - иллюстрирует реализацию шаблона Единицы работы. Это немного похоже на это.

class UoW(){ 
    private array $dirty; 
    private array $clean; 
    private array $new; 
    private array $delete; 

    public static function markClean(Entity_Class $Object){ 
    //remove the class from any of the other arrays, add it to the clean array 
    } 

    public static function markDirty(Entity_Class $Object){ 
    //remove the class from any of the other arrays, add it to the dirty array 
    } 

    public static function markNew(Entity_Class $Object){ 
    //add blank entity classes to the new array 
    } 

    public static function markDelete(Entity_Class $Object){ 
    //remove the class reference from other arrays, mark for deletion 
    } 

    public function commit(){ 
    //perform all queued operations, move all objects into new array, remove any deleted objects 
    } 
} 

class MyMapper(){ 
    public function setName($value){ 
    $this->name = $value; 
    UoW::markDirty($this);//here's where the problem is 
    } 
} 

(Игнорирование проблемы статических вызовов и зависимостей на минуту)

Автор отмечает, что эта реализация требует кодировщика, чтобы вставить соответствующие UOW методов маркировки, и что это факультативное чествование картины может привести к ошибкам. Теперь, принимая на борте плюсов и минусов конкретных аксессоров, вы могли бы, возможно, автоматизировать UOW вызов, как это:

public function __set($key,$value){ 
    //check to see if this is valid property for this class 
    //assuming the class has an array defining allowed properties 
    if(property_exists($this,$key)){ 
     $this->$key = $value; 
     UoW::markDirty($this); 

     /* 
     * or alternatively use an observer relationship 
     * i.e. $this->notify(); 
     * assuming the UoW has been attached prior to this operation 
     */ 
     } 
    } 

Итак, мой вопрос, как бы вы о гарантирующем соответствующем методе UOW был вызван при установке свойства объекта домена?

+0

* Единица работы * и другие шаблоны подробно описаны в [* Образцы архитектуры корпоративных приложений * Мартин Фаулер] (http://martinfowler.com/eaaCatalog/index.html). [Вы можете прочитать отрывки из него (включая соответствующие страницы UoW) в Google Книгах.] (Http://books.google.de/books?id=FyWZt5DdvFkC&lpg=PT213&ots=eEDx-vWx6E&dq=%22with%20object%20registration%20 (Рисунок% 2011.2)% 22 & pg = PT211 # v = onepage & q =% 22w%% 20object% 20registration% 20 (Рисунок% 2011.2)% 22 & f = false) Фаулер упоминает * Регистрация объекта *, * Регистрация вызывающего абонента * и * UoWController * как возможные подходы , – Gordon

+0

У меня есть книга прямо здесь, на моем столе, но ни один из методов «автоматизировать» регистрацию или уведомление. Регистрация объекта и вызывающего абонента исключает необходимость отмечать изменения данных в объекте, но требует, чтобы все изменения в модели выполнялись самим UoW в commit(). – sunwukung

+0

ну, он упоминает АОП, но это, по общему признанию, едва ли возможно для PHP. Модели наблюдателей звучат хорошо для меня. – Gordon

ответ

0

Лучший подход, который я нашел, - объявить свойства «защищены», а затем использовать комментарии PHPDoc, чтобы «разоблачить» их как общедоступные. Что-то вроде:

/** 
* @property string $prop 
*/ 
class Foo extends UoW { 
    protected $prop = "foo"; 

    public function __set($name, $value) { 
     if (property_exists($this, $name)) { 
      $this->$name = $value; 
      $this->markDirty(); 
     } 
    } 
} 

Это приведет к тому, IDE и большинство инструментов, чтобы подобрать то, что foo-> проп это свойство, обеспечивая при этом грязный знак получает набор.