목차

  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

+ Recent posts