2012-03-09 220 views
0

與面向特定語言的問題相比,這更多是面向模式的問題。假設我有一個用戶對象,它的形式是:堅持模型對象的模式?

class User 
    var id 
    var email 
    var password 
    var dateCreated 
end 
是我見過堅持用戶對象

兩種常見的方法如下:

// Approach 1 
new User(id) 
    ->setEmail(email) 
    ->setPassword(pass) 
    ->setDateCreated(date) 
    ->saveNew() 

在這種方法中,用戶對象。已每個屬性設置,然後saveNew方法將建立正確的插入語句使用上分別設置了用戶的屬性數據庫上執行(例如,insert into user values (this.email, ...)另一種方法:

// Approach 2 
new User()->saveNew(User userObj) 

在這個例子中,你會發現save方法雖然是一個實例方法,但它被看作是一種靜態方法,因爲它正在傳遞一個已填充的User對象,而不是處理它自己的數據,而這又會建立起來正確的陳述(例如,insert into user values (user.email, ...))。

第二種方法對我來說感覺有點不對。但是,這就是我問你的原因。作爲延續,讓我問你一個類似的問題。比方說,我們想要獲取一個用戶。我們可以做類似如下:

new User(id)->fetch- 或 -new User()->fetch(id)

現在,在獲取方法,我已經看到了這2種方法:

function fetch 
    result = db->fetch('select * from user where id=this.id') 

    user = new User() 
    user->setId(result->id) 
    user->setEmail(result->email) 
    user->setPassword(result->password) 
    user->setDateCreated(result->dateCreated) 

    return user 
end 

- 和 -

function fetch 
    result = db->fetch('select * from user where id=this.id') 

    // We can set the properties directly or through their 'setters' 
    this->id = result->id 
    this->email = result->email 
    this->password = result->password 
    this->dateCreated = result->dateCreated 

    return this 
end 

返回一個新的用戶對象而不是se對this的屬性看起來反直覺,但我看到它的地方。這一切是否重要?有沒有一個合適的,純粹的方式來做到這一點?

回答

0

第二種方法對我來說感覺不錯。如果像靜態方法那樣使用方法,它應該是一個靜態方法,句點。創建一個類的實例,其唯一目的是能夠調用其上的成員方法,實際上它作用於另一個完全不相關的類實例,作爲參數傳遞給它,是恕我直言的醜陋,浪費和難以閱讀時間。

OTOH讓班級承擔自身的責任(除了小而簡單的系統)通常不是最好的主意。這種方法不能縮放。如果你將持久性邏輯分散到各處,如果需要遷移到不同的數據庫,它將變成一場噩夢。持久性是一個與表示用戶的想法正交的概念,所以最好在不同的類中處理它。這樣的類通常被稱爲Data Access Objects (DAO)。使用DAO可能是這樣的:

dao = new UserDAO() 
... 
user = new User(id) 
user->setEmail(email) 
user->setPassword(pass) 
user->setDateCreated(date) 
dao->save(user) 

... 

user2 = dao->fetch(id2) 

的關注分離從持久機制的細節問題細節隔離域對象(實體)。這可能使您可以切換到不同的持久性提供程序,甚至可以並行使用多個持久性機制,而無需觸及域對象。 (好吧,實際上並不總是那麼清楚,但這仍然是朝着正確方向邁出的一步。)

+0

謝謝佩特。我更新了這個問題,增加了另一個案例。在'取'的例子中你有什麼感覺? – naivedeveloper 2012-03-09 20:14:05

+0

@naivedeveloper,看我的更新。 – 2012-03-09 20:30:44