2013-12-22 56 views
1

我有一個類User和類UserFactory(工廠模式)。工廠連接到SQL並創建用戶對象的實例。哪個類理想地分配屬性:User或UserFactory?

由於我們經常需要預處理從數據庫中檢索的字段,所以我想知道哪個是最好的地方。例如(簡體):

class UserFactory { 
    function getUserByID($id) { 
     $q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id); 

     if(!$q) 
      return FALSE; 

     return new User($q); 
    } 
} 

class User { 
    function __construct($obj) { 
     if(!empty($obj->id)) $this->ID = (int) $obj->id; 
     if(!empty($obj->name)) $this->name = $obj->name; 
     if(!empty($obj->email)) $this->email = $this->verifyEmail($obj->email); 
    } 
} 

在這個例子中User對象不實際的處理,但我不喜歡,我怎麼還被迫當我有這個UserFactory設計使用實際的SQL字段名在User對象成爲SQL和PHP之間的一個層。

所以我可以在處理移動到UserFactory像這樣:

class UserFactory { 
    function getUserByID($id) { 
     $q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id); 

     if(!$q) 
      return FALSE; 

     $user = new User($q->id); 
     $user->setName($q->name); 
     $user->setEmail($q->email); 

     return $user; 
    } 
} 

class User { 
    function __construct($id) { 
     $this->ID = (int) $id; 
    } 

    function setName($name) { 
     $this->name = $name; 
    } 

    function setEmail($email) { 
     $this->email = $this->verifyEmail($email); 
    } 
} 

我想這是做事情的好辦法,但現在我在做額外的函數調用它似乎沒有必要每個屬性,我必須用我創建的每個UserFactory函數手動設置屬性列表。

我在哪裏理想地處理這些字段並將它們分配給對象?什麼是'接受的方式'?我會爲每個屬性創建一個setter,還是爲User類構造函數添加多個參數...我想聽聽您的想法。

(我知道這些「理想的代碼風格」的問題可能是主觀的,希望我沒有違反任何這方面的社會準則。)

+0

如果你有在用戶構造你可以抽象的字段名每個屬性不同的參數。 –

回答

1

UserFactory是不是一個真正的工廠類,但一個Data Mapper

所以你的第二個例子是正確的,因爲域模型不應該知道任何有關數據庫。您也可以將它與Table Data Gateway結合使用。

更多關於這個問題:http://richard.jp.leguen.ca/not-blog/why-use-table-data-gateways/

+0

良好的通話,我想這是一個工廠和一個數據映射器在同一時間。我根據他們的能力有不同的用戶類別,例如'UserAdmin','UserAuthor' ... – Robbert

+0

如果用戶有幾十個字段呢?你會爲每個屬性創建一個setter,還是創建一個獨立的函數來同時處理所有的處理? – Robbert

+1

一個很好的方法是來自zend框架的建議。你有一個'setOptions'方法來獲取一個包含所有字段的數組。 [創建模型和數據庫表](http://framework.zend.com/manual/1.12/en/learning.quickstart.create-model.html)。 (向下滾動到中間) – bitWorking