2016-05-31 6 views
0

私のRubyのコードは、いくつかの複雑なオブジェクトのビルドコンクリート工場、持っている:今抽象ファクトリは「既存のアイテムの作成または検索」を担当できますか?

author = Author::Factory.build(email: "[email protected]") 

class Author 
    class Factory < BaseFactory 
    def self.build(email: nil) 
     # ... Some data preparation and defaults 
     Author.new(
     email: email 
     # Map and assign more attributes 
    ) 
    end 
    end 
end 

を、私は私のどちらかが、 を新しいものを構築するかのいずれかを割り当てる必要がある状況に遭遇しました既存のコレクション。 データベース用語:UPSERT、またはActiveRecord:find_or_create_byです。

そして、この場合、私はわからない:

  1. は工場自体を作るための適切な抽象ファクトリーのためのタスクと
  2. これを実装する適切な方法は、コレクションを渡すことであるならば
  3. 、または ですそれを取得する責任があります。

にそれを渡す:

工場はそれを見つけるまかせ
author = Author::Factory.build(email: "[email protected]", existing: authors) 

class Author 
    class Factory < BaseFactory 
    def self.build(email: nil) 
     author = existing.find {|author| author.email == email } 
     # If not found, prepare and build a new one, like above. 
    end 
    end 
end 

author = Author::Factory.build(email: "[email protected]") 

class Author 
    class Factory < BaseFactory 
    def self.build(email: nil) 
     author = Author.find_in_existing_with(email: email) 
     # If not found, prepare and build a new one, like above. 
    end 
    end 
end 

ので:工場は、すべての-や建物を見つけるための責任を負うべきか?

もしそうなら、 と一致する必要がある項目を取得するか、呼び出し元がそれらを渡す必要がありますか?

+1

関連:http://stackoverflow.com/questions/4889494/it-is-better-to-have-a-caching-mechanism-inside-or-outside-of-a-factory-class – jaco0646

+0

In what(クライアントコードは、対応する著者が既に存在するかどうかを知るものではありません。 – guillaume31

+0

@ guillaume31:作成者が既に存在するかどうかを知る唯一の人です。したがって、作成者は作成者(2番目の例)に依頼したり、クライアントに依頼して作成者に渡したりすることができます(最初の例)。どちらの場合も、作成者は、著者#== '、' find'などですが、存在を確認する条件を定義することは、この存在チェックと呼ばれるタスクです。そして、工場や工場を呼び出す人がこれを実装すべきかどうかはわかりません。 – berkes

答えて

0

工場は創造的なパターンなので、クライアントは新たな新しいインスタンスを期待しています。

確かに、Factoryが内部で行っていることは、コードを消費することには関係ありません。しかし、Authorがドメインエンティティの場合、私はシステム内の新しい著者の "現実の"追加以外の何かのためにコンシューマーによってどのようにAuthor - ビルディングオブジェクトが使用されるのか見当たりません。

あなたが意味論的に不公平になり、新しいインスタンスをインスタンス化するのではなく、既存の作成者を再利用して呼び出し元を騙すことを望まない限り。しかし、それはあなたが通常はプロダクションでやることのようには見えません。

関連する問題