도서 요약 / / 2022. 12. 19. 10:14

[클린 코드] 8. 경계

클린 코드 도서 요약 내용입니다.

8장 경계

시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다. 때로는 패키지도 사고, 때로는 오픈 소스를 이용한다. 때로는 사내 다른 팀이 제공하는 컴포넌트를 사용한다. 어떤 식으로든 이 외부 코드를 우리 코드에 깔끔하게 통합해야만 한다.

외부 코드 사용하기

Map은 굉장히 다양한 인터페이스로 수많은 기능을 제공한다. 하지만 그만큼 위험도 크다.

  • Map 사용자라면 누구나 Map 내용을 지울 권한이 있다는 말이다.
  • 객체 유형을 제한하지 않는다.
Map sensors = new HashMap();

Sensor s = (Sensor) sensors.get(sensorId);

이 코드를 다음 처럼 제네릭을 사용하면 코드 가독성이 크게 높아진다.

Map<String, Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);

하지만 위 방법도 "Map<String, Sensor>가 사용자에게 필요하지 않는 기능까지 제공한다"는 문제는 해결하지 못한다.

더 깔끔하게 사용한 코드다.

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

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

Map 클래스를 사용할 때마다 위와 같이 캡슐화하라는 소리가 아니다. Map을 여기저기 넘기지 말라는 말이다. Map 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다.

경계 살피고 익히기

외부 코드를 사용하면 적은 시간에 더 많은 기능을 출시하기 쉬워진다. 만약 외부에서 가져온 패키지를 사용하고 싶다면 어디서 어떻게 시작해야 좋을까? 외부 패키지 테스트는 우리 책임은 아니다. 하지만 우리 자신을 위해 우리가 사용할 코드를 테스트하는 편이 바람직하다.

외부 코드를 익히기는 어렵다. 우리 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까? 짐 뉴커크는 이를 학습 테스트라 부른다.
학습 테스트는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다. 학습 테스트는 API를 사용하려는 목적에 초점을 맞춘다.

log4j 익히기

LogTest를 작성하고 모든 지식을 독자적인 로거 클래스로 캡슐화한다. 그러면 나머지 프로그램은 log4j 경계 인터페이스를 몰라도 된다.

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

학습 테스트는 이해도를 높여주는 정확한 실험이다. 투자하는 노력보다 얻는 성과가 더 크다. 패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인한다.

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

지정한 주파수를 이용해 이 스트림에서 들어오는 자료를 아날로그 신호로 전송하라.

저쪽 팀이 아직 API를 설계하지 않았으므로 구체적인 방법은 몰랐다.

이쪽 코드를 진행하고자 우리는 자체적으로 인터페이스를 정의했다.
Transmitter라는 간단한 클래스를 만든 후 transmit라는 메서드를 추가했다.

이와 같은 설계는 테스트도 아주 편하다. 적절한 FakeTransmitter 클래스를 사용하면 CummunicationsController 클래스를 테스트할 수 있다.

깨끗한 경계

변경이 대표적인 예다. 소프트웨어 설계가 우수하다면 변경하는데 많은 투자와 재작업이 필요하지 않다. 엄청난 시간과 노력과 재작업을 요구하지 않는다.

경계에 위치하는 코드는 깔끔하게 분리한다. 또한 기대치를 정의하는 테스트 케이스도 작성한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유