Dev/Books

[CleanCode] 8장. 경계

kyeoneee 2020. 5. 18. 00:50
반응형

목차

  1. 외부 코드 사용하기
  2. 경계 살피고 익히기
  3. log4j 익히기
  4. 학습 테스트는 공짜 이상이다
  5. 아직 존재하지 않는 코드를 사용하기
  6. 깨끗한 경계

패키지를 사거나, 오픈소스를 사용하는 등 외부의 코드와 팀의 코드를 함께 사용할 때 소프트웨어 경계를 깔끔하게 처리하여 통합하는 방법에 대하여 이야기 한다.


외부 코드 사용하기

  • 인터페이스 제공자
    더 많은 환경에 돌아가게 하기 위해 적용성을 최대한 넓히려 함
  • 인터페이스 사용자
    자신의 요구에 집중하는 인터페이스를 바람

경계 인터페이스가 외부에 공개되지 않도록 한다.
캡슐화 등을 통해 API의 인수나 메서드의 반환 값 등으로 경계 인터페이스를 직접 노출하지 않도록 한다. 이 방법을 통해 경계 인터페이스가 변경 되었을 때 관련된 코드를 모두 고치지 않아도 되고, 불필요한 인터페이스를 노출시키지 않는 장점도 얻을 수 있다.

Bad :

Map sensors = new HashMap();
Sensor s = (Sensors)sensors.get(sensorId);

Good :

public class Sensors {
  private Map sensors = new HashMap();

  public Sensor getById(String id) {
    return (Sensor) sensors.get(id);
  }
}

경계 살피고 익히기

사용하려는 방식대로 외부 API를 호출하는 학습 테스트 작성을 통해 API를 익힌다.


log4j 익히기

문서를 모두 다 읽어서 라이브러리를 익히는 것이 아닌, 학습 테스트를 작성하며 발생하는 에러들을 해결해 나가며 학습한다.
이 과정에서 얻은 지식을 단위 테스트로 정리하고 독자적인 클래스로 분리하면 나머지 클래스는 해당 라이브러리의 경계 인터페이스를 몰라도 된다.

학습 테스트는 공짜 이상이다

학습 테스트는 해당 API를 학습하는 것 외에도 장점을 가진다.
학습 테스트를 위해 생성한 테스트 코드로 새 버전이 출시되었을 때 해당 버전이 우리 코드에 호환되는지를 확인할 수 있다.


아직 존재하지 않는 코드를 사용하기

아직 존재하지 않아 모르는 기능을 사용해야 할 때는 인터페이스로 구현한다.
인터페이스로 구현하면?

  • 인터페이스를 전적으로 통제 할 수 있다
  • 코드 가독성이 높아지고 의도가 분명해진다
  • 테스트 코드 작성에 용이하다

깨끗한 경계

외부 인터페이스를 사용할 때 경계에 위치하는 코드는 깔끔히 분리하고 사용할 의도에 알맞는 테스트 케이스를 작성하여 향후 변경 비용이 커지지 않도록 주의해야 한다.

  • 새로운 클래스로 경계를 감싼다
  • ADAPTER 패턴을 활용하자


참고하면 좋을 문서

일급 컬렉션

  • https://jojoldu.tistory.com/412 - 컬렉션도 외부 인터페이스이다. 일급 컬렉션은 외부 인터페이스 사용하기 단락의 의미대로 컬렉션을 사용하는 방법이다.

Adapter Pattern

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 인터페이스로 변환하는 패턴
호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

img

Head First Design Pattern의 예시

public interface Duck {
  public void quack();
  public void flyHigh();
}

public interface Turkey {
  public void gobble();
  public void fly();
}

public class WildTurkey implements Turkey {
  ...
}

public class TurkeyAdapter implement Duck {
  Turkey turkey;

  public TurkeyAdapter(Turkey turkey) {
    this.turkey = turkey;
  }

  public void quack() {
    turkey.gobble;
  }

  public void flyHigh() {
    turkey.fly();
  }
}

public class DuckDrive {
  public static void main(String[] args) {
    WildTurkey wildTurkey = new WildTurkey();
    Duck turkeyAdapter = new TurkeyAdapter(wildTurkey);

    turkeyAdapter.quack();
  }
}
반응형

'Dev > Books' 카테고리의 다른 글

[CleanCode] 10장. 클래스  (0) 2020.05.31
[CleanCode] 9장. 단위 테스트  (0) 2020.05.18
[CleanCode] 7장. 예외 처리  (0) 2020.05.16
[CleanCode] 6장. 객체와 자료 구조  (0) 2020.05.15
[CleanCode] 5장. 형식 맞추기  (0) 2020.05.12