2014-11-19 2 views
1

많은 멤버 (~ 20)가있는 클래스가 있습니다. 좋은 생성자가 옵션 (많은 매개 변수로 인해)이 아니므로 코드를 잘 읽을 수 없도록 초기화해야합니다.많은 멤버가있는 클래스 (Builder가 아닌)를 처리 할 디자인 패턴

그래서 Builder DP를 사용하려고했습니다. 유일한 문제는 그러한 클래스를 확장 할 때 매우 불쾌하다는 것입니다.

이 상황 (많은 회원이있는 수업)을 잘 처리하려면 디자인 후드를 사용해야합니까?

고맙습니다.

+0

대부분의 애트리뷰트에 대한 기본값을 가지므로 * 프로토 타입 * 디자인 패턴을 적용하고 프로토 타입을 단순히 복제하여 새 오브젝트를 만들 수 있습니까? – user1438038

+0

이 클래스를 여러 클래스로 분할하는 것이 더 좋을지도 모릅니다. – pomkine

+0

회원은 무엇입니까? 'Map'을 사용할 수 없습니까? –

답변

1

여러분이 말했듯이 20 개의 필드는 생성자에 대해 많은 부분을 차지합니다. 가독성과 관련, 내 마음에 오는 패턴이 static 팩토리 메소드이다 (그러나 Joshua Bloch's Effective Java의 의미에서가 아니라 공장 방법 GoF book).

그는 책에서 말했듯이, (생성자와 달리) 이름 잘 선택한 이름을 가진 정적 메서드가 쉽게 사용할 수 있도록하고 그 결과 클라이언트 코드가 static 팩토리 메소드 (의 항목 1) 읽기 쉽습니다.

class ManyFields { 
    T a; 
    U b; 
    (...) 
    V t; 
} 

그런 식으로, 당신은 당신의 코드에서 다른 사용 패턴을 다루는 새로운 static 팩토리 메소드가 할 더 쉽고 읽을 수있는/동전을 적용한다

ManyFields.withAtoFzeroed(g, h, i, ..., t) 
ManyFields.onlyGandJ(g, j) 
ManyFields.consonantsZeroed(a, e, i, o, u) 
(...) 

등의 작업을 수행 할 수 있습니다.

물론 이러한 방법에 필요한 매개 변수의 수가 줄어들 기 때문에 기본 값 집합을 사용하면 도움이됩니다.

게다가 정적 팩토리 메소드는 호출 될 때마다 새 객체를 만들거나 사전 정의 된 인스턴스 allowant, 캐싱 등을 만들 필요가 없습니다. 결과적으로 동일한 객체가 자주 요청되는 경우이 기술로 성능을 향상시킬 수 있습니다 클래스에 사용 된 가장 일반적인 객체를 강조 표시하는 것 외에는

그러나 정적 팩토리 메소드의 유용성 (가독성 측면에서)은 대개 이러한 매개 변수를 공통 값, 기본값 등과 같이 그룹화 할 수 있는지에 달려 있습니다. 일반적으로 이러한 매개 변수를 분할하는 것이 필요합니다. 큰 클래스는 작은 클래스로 만들고 컴포지션을 사용합니다 (@dkaztel이 제안한대로).

어쨌든 많은 생성자 매개 변수를 처리 할 때 가장 좋은 방법은 일반적으로 빌더입니다.

당신이 그것을 피하려고 감안할 때, 당신은 또한 당신의 세터 method chaining를 사용하여 가독성을 향상시킬 수 있습니다. 이 answer

ManyFields obj = new ManyFields(); 
obj.a(A).b(B).d(D).t(T).v(V).f(F); 

builders and fluent interfaces도 유용 할 수 있습니다.

1

기본값이없는 필드는 엄청납니다. 클래스를 여러 클래스로 분할하거나 일부 필드를 복합 객체로 그룹화하는 방법이 있어야합니다.

예를 들어 거리, 국가, 지구 등의 필드가있는 경우이 모든 것을 하나의 Address 개체로 그룹화 할 수 있습니다.

두 번 할 수 있으면 생성자를 관리 할 수 ​​있어야합니다.

기본값이없는 필드가있는 경우 Builder 패턴의 값이 손실되지 않도록 모든 필드를 지정해야합니다. 생성자를 사용할 수도 있습니다.

0

어쩌면 이것은 정말 어리석은 일일 수도 있지만, Setters 전체를 사용하여 새로운 Entity 클래스를 만들 수 있습니다. 그러면 빌더, 로더 또는 무엇이든간에 원하는 방식으로 오브젝트를 작성할 수 있습니다.

그런 다음 현재 클래스가 해당 Entity 유형의 단일 매개 변수를 허용하도록하고 생성자에서 Validate 메소드를 호출하여 완료되었는지 확인한 다음 Entity에 저장된 데이터를 사용하여 클래스에 전원을 공급합니다.

엔터티 및 해당 유효성 검사 규칙을 만드는 데는 상용구 코드가 많이 필요할 수 있지만 실제 사용법은 매우 간단합니다.