2012-03-09 98 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