반응형
분류 코드마다 동작이 다른 경우 "분류 코드를 상태/전략 패턴으로 치환" 리팩토링을 적용할 수 있다.
필요한 상황은?
분류 코드마다 객체가 다른 동작을 한다.
문제는?
동작을 switch 문으로 나누고 있지만 분류 코드가 동적으로 변하므로 분류 코드를 하위 클래스로 치환은 사용이 불가능하다.
public class Logger {
public static final int STATE_STOPPED = 0;
public static final int STATE_LOGGING = 1;
private int state;
...
public Logger() {
state = STATE_STOPPED;
}
public void start() {
switch (state) {
case STATE_STOPPED:
...
state = STATE_LOGGING;
...
}
}
}
해법은?
분류 코드를 나타내는 새로운 클래스를 작성해서 상태/전략 패턴을 사용한다.
public abstract class State {
public abstract int getTypeCode();
}
public class stateStopped extends State {
@Override
public int getTypeCode() {
return Logger.STATE_STOPPED;
}
}
public class stateLogging extends State {
@Override
public int getTypeCode() {
return Logger.STATE_LOGGING;
}
}
public class Logger {
public static final int STATE_STOPPED = 0;
public static final int STATE_LOGGING = 1;
private State state;
public Logger() {
setState(STATE_STOPPED);
}
public void start() {
switch (getState()) {
case STATE_STOPPED:
...
setState(STATE_LOGGING);
...
}
}
}
결과는?
분류 코드 타입 판별이 가능해진다.
분류 코드에 따른 클래스 동작을 다형성으로 해결할 수 있다.
클래스 개수가 늘어난다.
방법은?
1. 분류 코드를 자기 캡슐화 한다.
2. 분류 코드를 나타내는 새로운 클래스(상태) 클래스를 작성한다.
3. 분류 코드 값 마다 상태 객체의 하위 클래스를 작성한다.
4. 분류 코드를 얻는 추상 메소드를 상태 객체에 작성한다.
5. 하위 클래스는 추상 메소드를 오버라이드해서 분류 코드를 반환한다.
6. 분류 코드를 사용하는 클래스에 상태 객체용 필드를 추가한다.
7. 분류 코드를 조사하는 코드를 분류 코드를 얻는 메소드 호출로 치환한다.
8. 분류 코드를 변경하는 코드를 상태 객체를 변경하는 코드로 치환한다.
반응형
'리팩토링' 카테고리의 다른 글
[리팩토링] 분류 코드를 하위 클래스로 치환 (0) | 2023.11.06 |
---|---|
[리팩토링] 분류 코드를 클래스로 치환 (0) | 2023.11.06 |
[리팩토링] 클래스 추출 (0) | 2023.11.06 |
[리팩토링] 자바 코딩 규약 (Java Coding Conventions) 8가지 (0) | 2023.11.06 |
[리팩토링] 메소드 추출 (0) | 2023.11.06 |