시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다
이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다.
외부 코드 사용하기
더 많은 환경에서 돌아가야 더 많은 고객이 구매하니까 패키지 제공자나 프레임워크 제공자는 적용성을 최대한 넓히려 애쓴다. 반면 사용자는 자신의 요구에 집중하는 인터페이스를 바란다.
이런 차이로 시스템 경계에 문제가 생길 소지가 많다.
ex) java.util.Map
설명이 완전히 java적인 내용이긴 한데.. 뭘 의미하고 있는지를 알아두면 좋을것 같다.
Map은 다양한 인터페이스로 수많은 기능을 제공한다.
이러한 기능성과 유연성은 확실히 유용하지만
Map을 그대로 넘긴다는 뜻은 예를들어 Map 내용을 지우는 clear()함수를 누구나 지울 권한을 가질 수 있다는 뜻과 같다.
Map sensors = new HashMap();
Sensor s = (Sensor) sensors.get(sensorId);
또한 위와 같이 Map을 올바른 유형의 Object로 변환할 책임은 Map을 구현한 곳이 아닌 실제로 사용하는 클라이언트 쪽에 있게 된다.
또한 의도가 드러나지 않는다. 대신 다음과 같이 Generics를 사용하면 코드 가독성이 크게 높아진다.
Map<String, Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
하지만 여전히 사용자가 필요하지 않은 기능까지 넘기는것이 좋지 않다.
다음과 같이 제네릭스 사용 여부라던지 경계 인터페이스인 Map을 Sensor 클래스 안에 숨겨보자.
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
}
그러면 Map 인터페이스가 변하더라도 Sensor 클래스 안에서 객체 유형을 관리하고 변환할 수 있게 된다.
또한, 필요한 인터페이스만 제공할 수 있게 된다.
경계 살피고 익히기
외부 코드를 익히기는 어렵다. 외부 코드를 통합하기도 어렵다. 만약 곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신 먼저 간단한 테스트 케이스를 작성해 외부 코드를 익히면 어떨까?
학습 테스트 는 프로그램에서 사용하려는 방식대로 외부 API를 호출한다. 통제된 환경에서 API를 제대로 이해하는지를 확인하는 셈이다. 학습 테스트는 API를 사용하려는 목적에 초점을 맞춘다.
학습 테스트는 공짜 이상이다.
학습 테스트는 이해도를 높여주는 정확한 실험이다.
학습 테스트에 드는 비용은 없고 필요한 지식만 확보하는 쉬운 방식이다.
패키지가 새로운 버젼이 나오면 학습 테스트를 돌려 차이가 있는지 확인한다.
새 버젼이 호환되지 않으면 바로 학습 테스트가 밝혀낸다.
이런 테스트가 존재한다면 어느 부분이 호환성 문제가 생기는지 빨리 밝혀내고 새 버젼으로 빨리 이전하기 쉬워진다.
아직 존재하지 않는 코드를 사용하기
경계와 관련해 또 다른 유형은 아는 코드와 모르는 코드를 분리하는 경계다.
ex) 저쪽 팀이 아직 API를 설계하지 않았으므로 구체적인 방법은 모를때
구현을 미루고 이쪽 코드를 진행하기 위해 자체적으로 인터페이스를 정의한다.
어뎁터 패턴을 이용해서 다른 팀이 개발하고 있는 코드를 분리하고, API 사용을 캡슐화해 API 바뀔때 수정할 코드를 한곳으로 모은다.
(부가적으로 테스트도 쉬워짐)
깨끗한 경계
통제하지 못하는 코드(오픈소스나 외부 라이브러리 등)를 사용할때는 주의해야한다.
경계에 위치하는 코드는 깔끔히 분리한다.
이쪽에서 상대 코드를 세세히 알 필요는 없다. 외부패키지에 의존하지 말고 통제가 가능한 우리 코드에 의존한다.
외부 패키지를 호출하는 코드를 가능한 줄여 경계를 관리하자.
Adapter pattern을 사용하던지 위에서 보았던것처럼 새로운 클래스로 경계를 감싸서 우리가 인터페이스를 만들어 제어하자.
핵심
-> 외부 라이브러리와 맞닿는 부분은 직접 쓰지말고 인터페이스 같은 방식으로 분리하고, 주도적으로 제어
이 파트는 좀 심오한 내용인것 같다..
일단 '분리' 자체에는 동의한다.
'독서 > cleancode' 카테고리의 다른 글
cleancode - class (0) | 2022.02.26 |
---|---|
cleancode - unit test (0) | 2022.01.25 |
cleancode - 오류처리 (0) | 2022.01.22 |
cleancode - 객체와 자료구조 (0) | 2022.01.21 |
clean code - 주석 & 형식 맞추기 (0) | 2022.01.20 |