우리의 응용 프로그램은 많은 원시 필드 및 부울 문맥이 거의 모든 흐름의 주위에 전달하고, 결정이 부울 플래그에 따라 촬영으로 상황 클래스 주위에 어느 정도 내장되어 있습니다. 이제 새로운 기능을 구현하기 위해 새로운 부울이 컨텍스트에 추가되었으며 10 개의 다른 장소에서 확인해야합니다. 일반적인 흐름은이 예제와 비슷한 구조를가집니다.리팩터링 부울 기반 흐름
public void handle(context) {
if (context.isBig())
drawBigThing(context)
else
drawSmallThing(context)
//more code
...... handleColor(context) //somewhere deeper in the flow/stack
}
private void handleColor(context) {
if (context.isBig())
takeMoreColor(context.getColor())
else
takeLessColor(context.getColor())
}
코드의 다른 부분에서 볼 수 있듯이 우리는 같은 플래그를 되돌아 보지만 그에 따라 다른 결정을 내립니다. 이제 context.isVeryBig()을 추가하면 어떻게 폭발 할 수 있는지보실 수 있습니다.
다른 책임을 지닌 메소드/클래스에서 쿼리되었지만 여전히 동일한 플래그에 관심이있는 부울 플래그를 리팩터링하는 몇 가지 아이디어가 있습니까?
하나의 아이디어는 부울 플래그를 보관하지 않고 각 책임에 대한 주/전략을 유지하는 것이지만 상황에 따라 책임이 누출됩니다 (어쨌든 분리 될 수 있습니까?). IFs이지만 최소한 하나의 위치에 그룹화되어 흐름이 시작되기 전에
A)의 두 번째 답변 예 , 그런 접근법을 제거하는 것이 좋습니다. 당신은 기본적으로 거기에 많은 글로벌 상태를 가지고 있으며, 필드에 직접 액세스하여 더 좋게 만들지 않습니다. B) 상태 및 Statemachine 및 다형성은 OO에서 "일반적인"답변입니다. – GhostCat
사례 IMO에 적용되는 https://sourcemaking.com/refactoring/smells/switch-statements를 참조하십시오. – JnRouvignac