내 루비 코드가 일부 복잡한 오브젝트 빌드 콘크리트 공장있다 : 이제초록 공장이 "기존 항목 생성 또는 찾기"에 책임이 있습니까?
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]") 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
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
공장이 그것을 찾을 분들께 :
에 전달?
그렇다면 팩터가 과 일치해야하는 항목을 가져 오거나 호출자가 전달해야하는 항목을 가져와야합니다.
관련 항목 : http://stackoverflow.com/questions/4889494/it-is-better-to-have-a-caching-mechanism-inside-or-outside-of-a-factory-class – jaco0646
내용 (use) case는 해당 작성자가 이미 존재하는지 여부를 클라이언트 코드 *가 아닌 * 알 수 있습니까? – guillaume31
@ guillaume31 : 작성자가 이미 존재하는지 여부를 알 수있는 유일한 사람입니다. 따라서 Author-factory는 작성자 (두 번째 예)에서 요청하거나 클라이언트에게 작성자에게 요청한 다음 전달 (첫 번째 예) 할 수 있지만 두 경우 모두 작성자는 존재 확인 Author # ==','find' 등등. 그러나 존재를 확인하는 조건을 정의하는 것은이 존재 체크를 호출하는 태스크입니다. 그리고 팩토리 나 팩토리를 호출하는 것이 이것을 구현해야하는지 잘 모르겠습니다. . – berkes