2011-09-27 4 views
1

안녕하세요 도메인 구동 디자인 및 공장/공장 방법에 관한 몇 가지 질문이 있습니다. Domain Driven Design Blue Book (Eric EVan 's Book)에 따르면 복잡한 생성자를 팩토리/팩토리 메서드/빌더에 캡슐화해야하므로 모든 불변 식을 검사하는 일관성있는 위치가 있으므로 내 질문에 대해서는 다음과 같습니다.DDD 및 팩터 리

마술 효과 (예 : 블로그의 게시물 + 효과 지속 시간, 사용 된 재료 (문자열 목록), 마법 효과와 관련된 여러 가지 속성 등)에서 CRUD를 조작 할 수있는 마법 주최자 응용 프로그램을 개발하고 있다고 가정 해 보겠습니다. 불변량의 일부는 마법 효과가 항상 제목, 마법 효과의 내용, 지속 시간 및 선택 사항을 가져야하며 응용 프로그램에 등록 된 사용자에 의해 게시되어야한다는 것입니다.

그래서 많은 불변성을 가지고 있기 때문에 나는 MagicEffect 객체를 만들고 모든 불변량을 검사하는 EffectBuilder를 가지고 있습니다.

사용자 클래스에서 이와 같은 작업을 수행해도 괜찮습니까?

public class User { 
// Several attributes and business methods 

public EffectBuilder publishEffect() [ 
EffectBuilder builder = new EffectBuilder(); 

builder.withAuthor(this); 

return builder; 
} 
}; 

그리고 다른 곳

User user = userRepository.findById(userId); 
MagicEffect effect = user.publishEffect().withTitle(title).withContent(content).withDuration(duration).withElements(elements).build(); 

userRepository.save(user); 

내가 매개 변수의 거대한 양의 거대한 방법이 첫 번째 예를 의미하지만 확인을 :

public class User { 
// Several attributes and business methods 

public MagicEffect publishEffect(final String title, final String content, final Long duration, final Collection<String> elements) [ 
EffectBuilder builder = new EffectBuilder(); 

builder.withAuthor(this); 
builder.withTitle(title); 
builder.withContent(content); 
builder.withDuration(duration); 
builder.withElements(elements); 

return builder.build(); 
} 
}; 

또는 내가 좋아하는 뭔가를해야 모든 불변 변수는 빌드 될 때 효과로 설정됩니다. 다른 시나리오에서는 프로그래밍 방식으로 유창한 인터페이스를 사용하여 코드 가독성을 향상 시키지만 불변량이 tim의 100 %를 충족시키지 않도록 할 수는 없습니다 이자형.

더 나은 접근 방법은 무엇입니까? 더 균형 잡힌 접근 방식이 있습니까?

감사 파블로

답변

1

나는 두 번째 접근 방식이 더 낫다고 생각합니다. 빌더의 핵심은 첫 번째 예제에서와 같이 많은 매개 변수 목록을 피하는 것입니다. Builder는 빌드하는 오브젝트에서 invariant를 시행 할 책임이 없습니다. 객체 자체가이를 강제합니다. 나는 제목이 없거나 기본 제목이없는 EffectBuilder의 인스턴스를 갖는 것이 완벽하다고 생각합니다. MagicEffect 자체가 '을 시행하는 한 모든 효과는 제목이'이어야합니다.

+0

예 나는 그 사실도 잘 알고 있지만, 내가 실제로하고 있지 않은 일을하고 있다고 말하는 것처럼 두 번째 접근법으로 느낀다. 코드는 사용자가 효과를 게시하지만 클라이언트가 반환 된 EffectBuilder에서 빌드 메서드를 호출 할 때까지 효과가 생성되지 않는다는 것을 의미합니다. 그러나 긴 매개 변수 목록을 사용하지 않으려면이 방법을 사용하겠습니다. –

+0

* publishEffect * responsibility가 User 객체에 속하지 않은 것일 수 있습니다. – Dmitry

+0

실제로 publishEffect *에 매개 변수로 Builder (제목, 내용 등)를 전달하는 것이 더 나을 수도 있습니다. – Dmitry

관련 문제