본문 바로가기
ETC/개발 지식

[CleanCode] 8장 경계

by heekng 2022. 7. 4.
반응형

8장 경계

외부 코드 사용하기

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

    public Sensor getById(String id) {
        return (Sensor) sensors.get(id);
    }
}
  • Map을 예시로 Map은 clear(), containsKey(), containsValue() 등 많은 기능을 제공한다.
    • 때문에 Map 사용자라면 누구나 clear()메서드를 이용해 Map 내용을 지울 수 있다.
    • 즉, 사용자에게 필요하지 않은 기능까지 제공한다.
  • 또한 Map이 반환하는 Object를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에 있다.
    • 제네릭스를 사용하면 코드 가독성이 높아지지만, 아직 사용자에게 필요하지 않은 기능까지 제공한다는 문제는 해결할 수 없다.
  • Map 인스턴스를 여기저기로 넘긴다면, Map 인터페이스가 변할 경우, 수정할 코드가 많아진다.
  • 따라서 위 코드와 같이 Map을 객체 안으로 숨기는 방법이 있다.
    • 이로 인해, Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다.
    • Sensors 클래스 안에서 객체 유형을 관리하고 변환하기 때문이다.
    • 또한, Sensors 클래스는 프로그램에 필요한 인터페이스만 제공한다. Sensors 클래스는 설계 규칙과 비즈니스 규칙을 따르도록 강제할 수 있다.
  • 항상 위와 같이 캡슐화하라는 말이 아닌, 경계 인터페이스를 여기저기 넘기지 말라는 것이다.

경계 살피고 익히기

  • 학습 테스트: 외부 코드를 익히기 전에 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히는 것

log4j 익히기

@Test
public void testLogAddAppender() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.removeAllAppenders();
    logger.addAppender(new ConsoleAppender(
        new PatternLayout("%p %t %m%n"),
        ConsoleAppender.SYSTEM_OUT));
    logger.info("hello");
}
  • 생략된 과정이 있지만 결과적으로 테스트코드를 통하여 Logger을 사용하는 과정이 테스트코드로 정리된다.
  • 이렇게 콘솔 로거를 초기화하는 방법을 익혔다면, 이 지식을 독자적인 로거 클래스로 캡슐화한다.
  • 그렇다면 나머지 프로그램은 log4j 경계 인터페이스를 몰라도 된다.

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

  • 학습 테스트에 드는 비용은 없다. 오히려 필요한 지식만 확보하는 손쉬운 방법이다.
  • 학습 테스트는 이해도를 높여주는 정확한 실험이다.
  • 학습 테스트는 공짜 이상이다. 투자하는 노력보다 얻는 성과가 더 크다. 패키지 새 버전이 나온다면 학습 테스트를 돌려 차이가 있는지 확인한다.
  • 학습 테스트를 이용한 학습이 필요하든 필요하지 않든 실제 코드와 동일한 방식으로 인터페이스를 사용하는 테스트 케이스가 필요하다.
    • 이러한 학습 테스트를 통해 패키지의 새 버전으로 이전하기 쉬워진다.

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

  • 아직 구현되지 않은 기능을 우리가 바라는 인터페이스로 자체 정의하고, 사용한다.
  • 해당 기능이 정의되었을 때에는 Adapter을 구현해 간극을 배운다.
  • ADAPTER패턴을 이용해 API 사용을 캡슐화하고, API가 바뀔 때 수정할 코드를 한곳으로 모은다.

깨끗한 경계

  • 소프트웨어 설계가 우수하다면 변경하는데 많은 투자와 재작업이 필요하지 않다.
  • 경계에 위치하는 코드는 깔끔히 분리한다. 또한 기대치를 정의하는 테스트 케이스도 작성한다.
  • 외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.
    • 새로운 클래스로 경계를 감싸거나 ADAPTER 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환하자.
반응형

'ETC > 개발 지식' 카테고리의 다른 글

빅오(Big-O) 표기법  (0) 2022.09.04
[CleanCode] 7장 오류 처리  (0) 2022.07.02
[CleanCode] 6장 객체와 자료구조  (0) 2022.07.02
[CleanCode] 5장 형식 맞추기  (0) 2022.06.30
[CleanCode] 4장 주석  (0) 2022.06.28
[CleanCode] 3장 함수 - 2  (0) 2022.06.26