8 분 소요

지금 당장 작동하는 코드를 작성하는데 집중한다면, 경계 인터페이스는 소홀하기 쉬운 영역인 듯 하다. Map을 클래스로 한 번 더 감싸는 방식이나, ADAPTER 디자인 패턴을 적용하는 방법을 적용하기 위해서는 늘 어떤 식으로 변화가 발생할 수 있을지를 예상해봐야 할 것 같다. 쉽지는 않겠지만, 그런 습관이 들어야 할 듯하다.


📆TIL(Today I Learned) 날짜

2022.04.09

📑오늘 읽은 범위

8.경계

✍🏻책에서 기억하고 싶은 내용

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

그렇지만 Map은 객체 유형을 제한하지 않는다. 마음만 먹으면 사용자는 어떤 객체 유형도 추가할 수 있다.

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

즉, Map이 반환하는 Object를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에 있다. 그래도 코드는 동작한다. 하지만 깨끗한 코드라 보기는 어렵다. 게다가 위와 같은 코드는 의도도 분명히 드러나지 않는다.

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

  public Sensor getById(String id) {
    return (Sensor) sensors.get(id);
  }
 // 이하 생략
}

경계 인터페이스인 Map을 Sensors 안으로 숨긴다. 따라서 Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다. 제네릭스를 사용하든 하지 않든 더 이상 문제가 안 된다. Sensors 클래스 안에서 객체 유형을 관리하고 변환하기 때문이다.

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

👉🏻경계 살피고 익히기
곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까? 짐 뉴커크는 이를 학습 테스트라 부른다.

👉🏻학습 테스트는 공짜 이상이다
학습 테스트에 드는 비용은 없다. 어쨌든 API를 배워야 하므로… 오히려 필요한 지식만 확보하는 손쉬운 방법이다. 학습 테스트는 이해도를 높여주는 정확한 실험이다. 학습 테스트는 공짜 이상이다. 투자하는 노력보다 얻는 성과가 더 크다. 패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인한다.

👉🏻아직 존재하지 않는 코드를 사용하기
경계와 관련해 또 다른 유형은 아는 코드와 모르는 코드를 분리하는 경계다. 떄로는 우리 지식이 경계를 너머 미치지 못하는 코드 영역도 있다. 떄로는 (적어도 지금은) 알려고 해도 알 수가 없다. 때로는 더 이상 내다보지 않기로 결정한다.

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

외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자. Map에서 봤듯이, 새로운 클래스로 경계를 감싸거나 아니면 ADAPTER 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환하자.


❓궁금한 내용, 잘 이해되지 않는 내용

  • 어댑터(ADAPTER) 패턴이란? 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

image

댓글남기기