2016-05-31 2 views
0

내 루비 코드가 일부 복잡한 오브젝트 빌드 콘크리트 공장있다 : 이제초록 공장이 "기존 항목 생성 또는 찾기"에 책임이 있습니까?

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]") 
    
    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 
    

    공장이 그것을 찾을 분들께 :

에 전달?

그렇다면 팩터가 과 일치해야하는 항목을 가져 오거나 호출자가 전달해야하는 항목을 가져와야합니다.

+1

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

+0

내용 (use) case는 해당 작성자가 이미 존재하는지 여부를 클라이언트 코드 *가 아닌 * 알 수 있습니까? – guillaume31

+0

@ guillaume31 : 작성자가 이미 존재하는지 여부를 알 수있는 유일한 사람입니다. 따라서 Author-factory는 작성자 (두 번째 예)에서 요청하거나 클라이언트에게 작성자에게 요청한 다음 전달 (첫 번째 예) 할 수 있지만 두 경우 모두 작성자는 존재 확인 Author # ==','find' 등등. 그러나 존재를 확인하는 조건을 정의하는 것은이 존재 체크를 호출하는 태스크입니다. 그리고 팩토리 나 팩토리를 호출하는 것이 이것을 구현해야하는지 잘 모르겠습니다. . – berkes

답변

0

공장은 창조적 인 패턴이므로 클라이언트는 새로운 인스턴스를 기대합니다.

물론 공장 내부적으로 코드를 사용하는 데 관심이 없습니다. 그러나 Author이 도메인 엔티티 인 경우 시스템에서 새로운 작성자를 "실제"추가하는 것 이외의 다른 목적으로 소비자가 Author - 빌드 개체를 어떻게 사용할 수 있는지 보지 못합니다.

의미 론적으로 불공정 해지고 발신자가 새로운 작성자를 재사용하여 재발행하지 않는 한 그렇게하지 않는 한. 그러나 그것은 프로덕션에서 일반적으로하는 것처럼 보이지 않습니다.