개발/java
자바로 배우는 리팩토링 입문
조앙'ㅁ'
2018. 3. 16. 23:40
읽는 중
3장 introduce assertion
코드 안에서 성립해야할 조건이라면 주석 대신 assert를 쓴다..
java -ea/-esa 로 활성 -da/-dsa로 비활성화.
-da를 해도 바이트코드는 남아있어서, unreachable statement써서 삭제해야함. 메모리를 절약해야하는 제한된 환경이나 클래스 파일 크기가 성능에 큰영향을 줄 때.. 라는데 별로 신경안써도 될 듯
assert expression: option; == if (!expr) throw new AssrtionError(option);
ex
private void updateAll() {
// 메서드를 호출한 스레드는 _lock 객체락을 취득해야만 함. 즉 syncrhonized(_lock) {} 내부에서만 호출할것!
// 따라서 Thread.holdsLock(_lock)은 true임이 틀림없음
// 이 경우에 이렇게 주석으로 남기지 말고 아래처럼!
assert Thread.holdsLock(_lock);
updateResult();
updateConsole();
if(_logger.isEnabled()) {
updateLogger();
}
}
* 7장 int로 객체를 구분하는 경우
* 분류 코드를 클래스로 치환
* int로 사용하면.. type safe가 아닌 문제가 생김. 분류 코드 범위 밖의 값이 사용됨. 다른 분류 코드와 착각함.
public enum ItemType {
BOOK(0),
DVD(1),
SOFTWARE(2);
private final int _typecode;
private ItemType(int typecode) {
_typecode = typecode;
}
public int getTypecode() {
return _typecode;
}
}
* 8장 분류 코드마다 동작이 다른 경우(1)
* 분류 코드를 하위 클래스로 치환
* 리팩토링을 해야하는지 여부는 기능 추가 예정이 있는지 중요.
* 9장 분류 코드마다 동작이 다른 경우(2)
* 분류 코드를 상태/전략 패턴으로 치환
* 상황: 분류 코드마다 객체가 다른 동작을 함. 동작을 switch문으로 나누고 있지만 분류 코드가 동적으로 변하므로 분류코드를 하위 클래스로 치환은 사용 불가.
* 동작을 switch문으로 나누고있지만 분류 코드가 동적으로 변하므로 분류 코드를 하위 클래스로 치환은 사용 불가할때.
public class Logger {
private enum State {
STOPPED {
@Override public void start() {
System.out.println("** START LOGGING **");
}
@Override public void stop() {}
@Override public void log(Strin ginfo) {
System.out.println("Ignoring: " + info);
}
};
LOGGING {
@Override public void start() {}
@Override public void stop() {
System.out.println("** STOP LOGGING **");
}
@Override public voidå log(Strin ginfo) {
System.out.println("Logging: " + info);
}
};
public abstract void start();
public abstract void stop();
public abstract void log(String info);
}
private State _state;
public Logger() {
setState(State.STOPPED);
}
public void setState(State state) {
_state = state;
}
public void start() {
_start.start();
setState(State.LOGGING)
}
public void stop() {
_start.stop();
setState(State.STOPPED)
}
public void log(String info) {
_state.log(info);
}
}