GO SIWOO!

[클린 코드] 8장 - 경계 본문

Develop/클린코드

[클린 코드] 8장 - 경계

gosiwoo 2023. 9. 19. 02:15

1. 외부 코드 사용하기

패키지 또는 프레임워크 사용자는 자신의 요구에 집중하는 인터페이스를 바란다 -> 시스템 경계에서 문제가 생길 수 있다.

// case1
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensordId);

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

case 1에서는 Map에 Sensor 객체가 들어갈지 장담할 수 없다. case 2로 제네릭스를 사용하지만 Map이 제공하는 여러 메서드를 사용할 수 있으므로 위험하다.

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

위처럼 캡슐화를 한 Sensors 객체에 Map을 숨기자, 숨김으로써 Map을 여기저기에 넘기지 않도록 주의한다.

2. 경계 살피고 익히기

외부의 코드를 익히고 프로젝트에 통합하는건 어렵다.

학습 테스트를 사용하자, 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히자. 학습 테스트를 사용하면 다음과 같은 이점이 있다.

  1. 다양한 조건에 따른 기능을 손쉽게 확인해볼 수 있다.
  2. 학습 테스트 코드를 개발 중에 참고할 수 있다.
  3. 프레임워크나 제품을 업그레이드할 때 호환성 검증을 도와준다.
  4. 테스트 작성에 좋은 훈련이 된다.
  5. 레퍼런스만 보는 것보다 새로운 기술을 공부하는 과정이 다채로워진다.

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

학습 테스트는 투자대비 성과가 크다.

패키지의 업데이트마다 테스트 코드가 미리 밝혀내고 새 버전의 패키지로 이전이 쉬워진다.

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

협업을 할 때 아직 정의되지 않고 통제되지 않는 API를 사용해야 할때 우리가 기대하는 해당 API의 기능을 바탕으로 분리하여 자체적으로 인터페이스를 정의한다. 자체적으로 정의한 인터페이스는 나중에 실제 API가 나오면 어댑터 패턴으로 API 인터페이스가 캡슐화되어 구현되었으므로 수정이 쉽다.

5. 깨끗한 경계

경계에 위치하는 코드는 깔끔히 분리하고 기대치를 정의하는 테스트케이스도 작성한다. 통제가 불가능한 외부의 코드를 우리의 코드를 통해 통제하는 방법이다.

앞서 설명한 Map의 캡슐화와 어댑터 패턴을 사용했을 때 경계를 깨끗하게 하는 효과가 있다.

 

'Develop > 클린코드' 카테고리의 다른 글

[클린 코드] 10장 - 클래스  (0) 2023.09.19
[클린 코드] 9장 - 단위 테스트  (0) 2023.09.19
[클린 코드] 4장 - 주석  (0) 2023.08.29
[클린 코드] 3장 - 함수  (0) 2023.07.21
[클린 코드] 2장 - 의미 있는 이름  (0) 2023.07.18