우리의 코드베이스는 나 자신과 마찬가지로 오래되고 새로운 프로그래머 이며 균일 성을 위해 수행 된 방식으로 신속하게 학습합니다 . 우리는 어딘가에서 시작해야한다고 생각하면서 다음과 같이 데이터 홀더 클래스를 리팩터링했습니다.
- 세터 메소드를 제거하고 모든 필드를 작성했습니다
final
(final
공식적으로 "양호합니다"). 세터는 생성자에서만 사용되었으므로 부작용이 없었습니다. - 빌더 클래스 소개
생성자 (처음에 리팩토링을 촉구 한 것)가 약 3 줄의 코드에 걸쳐 있기 때문에 Builder 클래스가 필요했습니다. 그것은이 많은 매개 변수를.
운 좋게도 내 팀원은 다른 모듈을 연구하고 있었고 세터가 필요했습니다. 필요한 값이 흐름의 다른 지점에서 가능해 졌기 때문입니다. 따라서 코드는 다음과 같습니다.
public void foo(Bar bar){
//do stuff
bar.setA(stuff);
//do more stuff
bar.setB(moreStuff);
}
나는 setter를 제거하면 필드가 불변 상태로 남아 있기 때문에 (이전에 불변성에 대해 열렬한 소리를 들었음) 빌더가 객체 생성을 트랜잭션으로 허용하기 때문에 빌더를 대신 사용해야한다고 주장했습니다. 다음 의사 코드를 스케치했습니다.
public void foo(Bar bar){
try{
bar.setA(a);
//enter exception-throwing stuff
bar.setB(b);
}catch(){}
}
해당 예외가 발생하면 bar
데이터가 손상되어 빌더로 피할 수 있습니다.
public Bar foo(){
Builder builder=new Builder();
try{
builder.setA(a);
//dangerous stuff;
builder.setB(b);
//more dangerous stuff
builder.setC(c);
return builder.build();
}catch(){}
return null;
}
팀원들은 문제의 예외가 절대 발생하지 않을 것이라고 회고했습니다. 이는 특정 코드 영역에 대해 충분히 공평하지만 나무의 숲이 빠져 있다고 생각합니다.
타협은 기존 솔루션으로 되돌아가는 것입니다. 즉 매개 변수가없는 생성자를 사용하고 필요에 따라 세터로 모든 것을 설정합니다. 근거는이 솔루션이 KISS 원칙을 따른다는 것입니다.
나는이 회사를 처음 접했고 (6 개월 미만)이 회사를 잃어 버렸다는 것을 완전히 알고 있습니다. 내가 가진 질문은 다음과 같습니다.
- "구식"대신 빌더를 사용하는 또 다른 주장이 있습니까?
- 내가 제안한 변화가 정말 가치가 있습니까?
하지만 정말,
- 새로운 것을 시도 할 때 그러한 주장을 더 잘 표현할 수있는 팁이 있습니까?
setA
?