해뜨기전에자자

자바로 배우는 리팩토링 입문 본문

개발/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);
    }
}


'개발 > java' 카테고리의 다른 글

이펙티브자바 3판 Effective java 3/E  (0) 2019.03.17
gc archive  (0) 2018.03.21