독서 기록/클린 코드

[클린 코드] 8장 경계

JoJobum 2023. 4. 24.

외부 코드(오픈 소스 등)를 사용하지 않을 수 없음, 있지만 매우 비효율적

=> 외부 코드와 우리의 코드를 깔끔하게 통합하기 위한 이야기

 

외부 코드 사용하기

인터페이스 제공자는 많은 고객을 유치하기 위해 범용성을 추구

인터페이스 사용자는 자신의 서비스에 특화되길 원함

 

예시로 java.util.Map을 들면

// Sensor 라는 객체를 담는 Map을 만든다면
Map<String, Sensor> sensors = new HashMap<Sensor>();

위와 같이 Map<String, Sensor> 인스턴스를 이곳 저곳에 넘긴다면 Map 인터페이스에 변경이 생길 시 수정할 코드가 많아진다. (현재로선 java.util.Map이 더 이상의 수정이 가해질 것 같지 않은 상태이지만, 이러한 상태에 도달하기 전까지 수정이 있었다는 것을 생각해야할 것) 

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

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

 

경계 인터페이스를 이용할 때에는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 유의하자.

 

 

경계 살피고 익히기

외부 코드를 사용하면 적은 시간에 더 많은 기능 출시하기 쉬움 

외부 코드를 테스트하는 것은 우리의 책임은 아니지만 사용할 것이라면 우리를 위해 테스트해야 한다.

 

그러면 외부 코드를 사용할 때 테스트는 어떻게 하냐? 

통제된 환경에서 사용하려는 방식대로 외부 API를 호출하고

이를 통해 외부 API를 제대로 이해하는지 확인

이를 학습 테스트라 부름

 

학습 테스트는 공짜 이상

학습 테스트에 드는 비용은 없음

왜냐 학습 테스트는 이해도를 높여주는 정확한 실험이고 투자하는 노력에 비해 얻는 성과가 더 크기 때문이다.

 

학습 테스트는 패키지가 예상대로 도는지 검증함

패키지의 새 버전이 나올 때마다 우리의 코드와 호환성에 문제가 생길 위험성이 생김

학습 테스트는 이러한 문제를 파악하게 해줌. 

 

이러한 테스트가 새 버전으로 이전하기 쉽게 해준다. 

그렇지 않다면 낡은 버전을 필요 이상으로 오랫동안 사용하려는 유혹에 빠지기 쉬움

 

 

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

경계를 구분할 때 외부와 우리의 코드로 나눴는데, 다른 유형으로는 아는 코드와 모르는 코드로 나눌 수 있다.

지식이 경계를 너머 미치지 못하는 영역이 존재, 반영구적 혹은 적어도 지금은 알 수 없음

 

이러한 경우 구현을 미루고 경계 인터페이스를 정의하고 (= 모르는 영역의 모듈에게 원하는 기능)

이를 사용하여 우리쪽의 코드를 구현

추후에 미지의 영역이 밝혀지면 Adapter 패턴으로 API 사용을 캡슐화하여, API가 바뀔 때마다 수정할 코드를 한곳으로 모음

 

 

깨끗한 경계

소프트웨어 설계가 우수하다면 변경하는데 많은 투자와 재작업이 필요하지 않음

외부 패키지는 통제 불가능 

고로 통제 가능한 우리 코드에 의존하는 것이 좋다

 

이를 위해 외부 패키지를 호출하는 코드를 최대한 줄여 경계를 관리하자

 

 

 

 

 

 

 

 

반응형

댓글