우리는 당신이 용어를 인텔리 당신에게 모든 것을 보여 주려 포기 너무 커서 공격적으로 큰 생성자를 코믹하게 될지 우리의 도메인 모델에 약간의 개체가 ...리팩토링 큰 생성자
큐 대부분 값 유형, 몇 가지 참조 유형이있는 유형 :
public class MyLegacyType
{
public MyLegacyType(int a1, int a2, int a3, ... int a50) // etc
{
}
}
이 유형은 변경할 수 없습니다. 유형 자체는 논리적으로 하나의 엔티티를 나타내며, 이는 속성이 많이 발생합니다. 이 유형을 구성하는 호출자는 여러 소스에서 나온 인수의 대부분을 제공하지만 일부는 기본값으로 제공됩니다. 아마도 결과 대신 건설에 제공 될 원천에 대한 패턴이있을 것입니다.
그러나 형식을 변경하는 방법은 변경할 수 있습니다. 현재 다음과 같은 코드 섹션이 있습니다.
- 유형에 IntelliSense가 부족합니다.
- 추악하고 읽을 수없는 코드.
- 합병 통증이 Connascence of Position으로 인해 발생했습니다.
즉각적인 대답은 병합에 도움이되는 기본값 및 명명 된 인수에 선택적 매개 변수를 이용하는 것입니다. 우리는 어느 정도 다른 형식으로이 작업을 수행합니다.
그러나 전체 리팩토링의 중간 정도 인 것처럼 느껴집니다.
다른 명백한 해결 방법은 생성자 인수로 사용되던 것에 대한 속성을 가진 컨테이너 유형으로 생성자 매개 변수를 줄이는 것입니다. 이렇게하면 생성자를 멋지게 정리할 수 있으며 컨테이너에 기본값을 포함시킬 수 있지만 기본적으로 문제를 다른 유형으로 이동시킬 수 있으며 선택적/명명 된 매개 변수 사용과 같을 수도 있습니다.
속성마다 (WithIntA
, WithIntB
) 또는 컨테이너 유형 (WithTheseInts(IntContainer c)
) 기준으로 모두 유창한 생성자 개념이 있습니다. 개인적으로, 나는이 접근법을 호출 측에서는 좋아하지만, 다시 한번 말하자면 큰 유형에 대해서 마치 하나의 문제를 푸는 대신 문제를 옮긴 것처럼 느껴진다.
내 질문에,이 혼란에 묻혀있는 사람이 있다면 : 이 문제에 대한 이러한 실행 가능한 리팩토링 전술입니까? 몇 가지 관련 경험, 함정 또는 비판으로 답을 조금 더 살피십시오. 나는 그것이 멋지게 보이고 읽기 쉽고 병합하기 쉽기 때문에 유창한 것들에 기대고있다.
나는 생성자 리팩터링의 성배가 빠져있는 것처럼 느껴진다 - 그래서 나는 제안에 개방적이다. 물론 이것은 또한 처음에는 많은 속성을 가진 유형을 갖는 불행하고 피할 수없는 부작용 일 수 있습니다 ...
선택적 생성자 인수에 대해 두 번째 접근법 (생성자 인수로 사용 된 특성에 대한 특성을 가진 컨테이너 유형)을 사용할 것입니다. 유창한 인터페이스는 좋지만 메서드 호출을 많이 연결해야하는 경우 약간 지저분해질 수 있습니다. IMO –