[Clean Code] 8장 | 경계

PADO·2020년 12월 29일
0

Clean Code

목록 보기
9/15
post-thumbnail

🧷 8장 | 경계

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

이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다.

📘 외부 코드 사용하기

java.util.Map

  • Generics를 사용하여 코드 가독성을 높일 수 있다.
  • 하지만 인터페이스가 언제든 변할 수 있기 때문에 Generics에 의존하는 것도 위험하다.
  • Map(인터페이스)를 사용할 클래스 안에서 관리하고 변환하면 설계 규칙과 비즈니스 규칙을 강제할 수 있다.

before)

Sensor라는 객체를 담는 Map을 만드려면 다음과 같이 Map을 생성한다.

Map sensors = new HashMap();

Sensor 객체가 필요한 코드는 다음과 같이 Sensor 객체를 가져온다.

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

Map이 반환하는 Object를 올바른 유형으로 변환할 책임은 클라이언트에 있다.

after) 경계 인터페이스인 Map을 Sensors 안으로 숨긴다.

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

Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다.
Sensors 클래스 안에서 객체 유형을 관리하고 변환하기 때문이다.

→ Map은 여기저기 넘기지 않는다.

Map과 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다.
공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다.

📘 경계 살피고 익히기

학습 테스트

  • 외부 코드와 기존 코드를 통합하기 전, 간단한 테스트 케이스를 작성해 외부 코드를 익힌다.
  • 테스트 케이스를 통해 얻은 지식을 독자적인 클래스로 캡슐화한다.

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

학습 테스트는 이해도를 높여주는 정확한 실험이다.

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

  • 필요한 외부 기능과 인터페이스를 자체적으로 정의하라.
  • 기존 코드와 외부 인터페이스 경계를 분리하라.
  • 기존 코드, 외부 인터페이스, 경계 테스트 케이스를 각각 작성하고 테스트하라.

📘 깨끗한 경계

  • 경계에 위치하는 코드는 깔끔히 분리하라.
  • 외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하라.
    → 새로운 클래스로 경계를 감싸거나 ADAPTER 패턴 사용

0개의 댓글