私の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
です。
そして、この場合、私はわからない:
- は工場自体を作るための適切な抽象ファクトリーのためのタスクと これを実装する適切な方法は、コレクションを渡すことであるならば
- 、または ですそれを取得する責任があります。
にそれを渡す:
工場はそれを見つけるまかせ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
ので:工場は、すべての-や建物を見つけるための責任を負うべきか?
もしそうなら、 と一致する必要がある項目を取得するか、呼び出し元がそれらを渡す必要がありますか?
関連:http://stackoverflow.com/questions/4889494/it-is-better-to-have-a-caching-mechanism-inside-or-outside-of-a-factory-class – jaco0646
In what(クライアントコードは、対応する著者が既に存在するかどうかを知るものではありません。 – guillaume31
@ guillaume31:作成者が既に存在するかどうかを知る唯一の人です。したがって、作成者は作成者(2番目の例)に依頼したり、クライアントに依頼して作成者に渡したりすることができます(最初の例)。どちらの場合も、作成者は、著者#== '、' find'などですが、存在を確認する条件を定義することは、この存在チェックと呼ばれるタスクです。そして、工場や工場を呼び出す人がこれを実装すべきかどうかはわかりません。 – berkes