2012-03-09 4 views
0

これは、言語固有のものとは対照的に、パターン指向の質問の方がますますです。私は、フォームのあるユーザーオブジェクトがあるとします。このアプローチではモデルオブジェクトを永続化するためのパターン?

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

、Userオブジェクトを次のように私はUserオブジェクトを永続化するために見てきた

class User 
    var id 
    var email 
    var password 
    var dateCreated 
end 

2つの一般的なアプローチがあります。各プロパティが設定されており、その後saveNew方法は、ユーザーに設定されたプロパティを使用して、データベース上で実行するために適切なinsert文を構築します(例えば、insert into user values (this.email, ...)別のアプローチ:

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

この例では、saveメソッドは、インスタンスメソッドではあるが、インスタンス化されたUserオブジェクトを渡して自分のデータで作業していない静的メソッドのように扱われています適切なステートメント(例:insert into user values (user.email, ...))。

私にとって第2のアプローチは、少し間違っていると感じます。しかし、それが私があなたに求めている理由です。続きとして、私にあなたに同様の質問をさせてください。たとえば、ユーザーを取得したいとします。我々は、次のような何かを行うことができます:

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とは対照的に新しいUserオブジェクトを返すthisのプロパティをttingは直感的ではないようだが、私はそれが場所を参照してください。これはすべて問題ですか?それを行うための適切な、純粋な方法がありますか?

答えて

0

第2のアプローチは、私には間違いないと感じています。メソッドが静的メソッドのように使用されている場合は、静的メソッドのperiodでなければなりません。そのクラスのメンバメソッドを呼び出すことができる唯一の目的でクラスのインスタンスを作成することは、実際には別のインスタンスで動作し、それと全く無関係なクラスインスタンスはパラメータとして渡されますが、IMHOは醜く、無駄であり、時間。

OTOH通常、クラスに(小さなシンプルなシステムを除いて)それ自体を永続させる責任を負わせることはお勧めできません。このアプローチは規模を拡大しません。他のDBに移行する必要が生じた場合、永続性のロジックが全面的に分散されていれば、悪夢になるでしょう。永続性は、ユーザーを表現するアイデアに直交する概念であるため、別のクラスでそれを処理することが最善です。そのようなクラスは、しばしば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) 

関心事の分離は、永続化メカニズムの核心ザラザラ詳細からあなたのドメインオブジェクト(エンティティ)を分離します。これにより、ドメインオブジェクトに触れることなく、異なる永続性プロバイダに切り替えたり、複数の永続化メカニズムを並行して使用したりすることができます。 (OK、実際には必ずしも明確なカットではありませんが、通常これは正しい方向のステップです)

+0

ありがとうございました。別のケースを追加するために質問を更新しました。あなたは「フェッチ」の例でどのように感じますか? – naivedeveloper

+0

@naivedeveloper、私の更新を参照してください。 –

関連する問題