본문 바로가기

도서/Clean Code

[Clean Code/클린 코드] 8장 경계

8장 경계

📖  통제가 불가능한 외부 패키지에 의존하는 대신 통제가 가능한 우리 코드에 의존하는 편이 훨씬 좋다.

 

 

목차

     


    🗒️ 책에서 기억하고 싶은 내용

    외부 코드 사용하기

    Map<String, Sensor> sensors = new HashMap<Sensors>();

    프로그램에서 Map<String, Sensors> 인스턴스를 여기저기로 넘긴다면, Map 인터페이스가 변할 경우, 수정할 코드가 상당히 많아진다.

     

    public class Sensors {
      private Map sensors = new HashMap();
    
      public Sensor getById(String id) {
        return (Sensor) sensors.get(id);
      }
    
      //이하 생략
    }

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

    ● Sensors 사용자는 제네릭스가 사용되었는지 여부에 신경 쓸 필요가 없다.
      ○ 제네릭스의 사용 여부는 Sensors 안에서 결정한다.

     경계 인터페이스인 Map을 Sensors 안으로 숨긴다.
      ○ 따라서 Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다.

    ● 또한 Sensors 클래스는 프로그램에 필요한 인터페이스만 제공한다.
      ○ 그래서 코드는 이해하기는 쉽지만 오용하기는 어렵다.
      
    ● Map 클래스를 사용할 때마다 위와 같이 캡슐화하라는 소리가 아니다. 경계 인터페이스를 여기저기 넘기지 말라는 말이다.   
      ○ Map 인스턴스를 공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다.

     

    경계 살피고 익히기

    외부 코드를 익히기는 어렵다. 외부 코드를 통합하기도 어렵다.   
    두 가지를 동시에 하기는 두 배나 어렵다.   
    곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까?

    : 학습 테스트

     

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

    실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 필요하다.   
    이런 경계 테스트가 있다면 패키지의 새 버전으로 이전하기 쉬워진다.

     

    🗒️ 소감

    자바 5가 제네릭스를 지원하면서 Map 인터페이스가 변해 실제로 제네릭스 사용을 금지하는 시스템을 보았다는 것을 읽고, 외부 코드 사용 시 경계를 명확히 할 필요성을 느꼈다.

    '경계를 살피고 익히기', 'log4j 익히기', '학습 테스트는 공짜 이상이다'를 읽고 학습 테스트의 유용함을 알게 되었다.
    외부 코드를 사용하며 개발 공부 중인 것이 있어 바로 학습 테스트를 적용해 볼 예정이다.

     

    🗒️ 궁금하거나 어려웠던 내용

    ● '아직 존재하지 않는 코드를 사용하기'에 나온 ADAPTER 패턴에 대해 좀 더 자세히 알고 싶다.
    ● 켄트 벡 『 TDD 』