목차
패키지를 사거나, 오픈소스를 사용하는 등 외부의 코드와 팀의 코드를 함께 사용할 때 소프트웨어 경계를 깔끔하게 처리하여 통합하는 방법에 대하여 이야기 한다.
외부 코드 사용하기
- 인터페이스 제공자
더 많은 환경에 돌아가게 하기 위해 적용성을 최대한 넓히려 함 - 인터페이스 사용자
자신의 요구에 집중하는 인터페이스를 바람
경계 인터페이스가 외부에 공개되지 않도록 한다.
캡슐화 등을 통해 API의 인수나 메서드의 반환 값 등으로 경계 인터페이스를 직접 노출하지 않도록 한다. 이 방법을 통해 경계 인터페이스가 변경 되었을 때 관련된 코드를 모두 고치지 않아도 되고, 불필요한 인터페이스를 노출시키지 않는 장점도 얻을 수 있다.
Bad :
Map sensors = new HashMap();
Sensor s = (Sensors)sensors.get(sensorId);
Good :
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
}
경계 살피고 익히기
사용하려는 방식대로 외부 API를 호출하는 학습 테스트 작성을 통해 API를 익힌다.
log4j 익히기
문서를 모두 다 읽어서 라이브러리를 익히는 것이 아닌, 학습 테스트를 작성하며 발생하는 에러들을 해결해 나가며 학습한다.
이 과정에서 얻은 지식을 단위 테스트로 정리하고 독자적인 클래스로 분리하면 나머지 클래스는 해당 라이브러리의 경계 인터페이스를 몰라도 된다.
학습 테스트는 공짜 이상이다
학습 테스트는 해당 API를 학습하는 것 외에도 장점을 가진다.
학습 테스트를 위해 생성한 테스트 코드로 새 버전이 출시되었을 때 해당 버전이 우리 코드에 호환되는지를 확인할 수 있다.
아직 존재하지 않는 코드를 사용하기
아직 존재하지 않아 모르는 기능을 사용해야 할 때는 인터페이스로 구현한다.
인터페이스로 구현하면?
- 인터페이스를 전적으로 통제 할 수 있다
- 코드 가독성이 높아지고 의도가 분명해진다
- 테스트 코드 작성에 용이하다
깨끗한 경계
외부 인터페이스를 사용할 때 경계에 위치하는 코드는 깔끔히 분리하고 사용할 의도에 알맞는 테스트 케이스를 작성하여 향후 변경 비용이 커지지 않도록 주의해야 한다.
- 새로운 클래스로 경계를 감싼다
- ADAPTER 패턴을 활용하자
참고하면 좋을 문서
일급 컬렉션
- https://jojoldu.tistory.com/412 - 컬렉션도 외부 인터페이스이다. 일급 컬렉션은 외부 인터페이스 사용하기 단락의 의미대로 컬렉션을 사용하는 방법이다.
Adapter Pattern
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 인터페이스로 변환하는 패턴
호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
Head First Design Pattern의 예시
public interface Duck {
public void quack();
public void flyHigh();
}
public interface Turkey {
public void gobble();
public void fly();
}
public class WildTurkey implements Turkey {
...
}
public class TurkeyAdapter implement Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble;
}
public void flyHigh() {
turkey.fly();
}
}
public class DuckDrive {
public static void main(String[] args) {
WildTurkey wildTurkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(wildTurkey);
turkeyAdapter.quack();
}
}
'Dev > Books' 카테고리의 다른 글
[CleanCode] 10장. 클래스 (0) | 2020.05.31 |
---|---|
[CleanCode] 9장. 단위 테스트 (0) | 2020.05.18 |
[CleanCode] 7장. 예외 처리 (0) | 2020.05.16 |
[CleanCode] 6장. 객체와 자료 구조 (0) | 2020.05.15 |
[CleanCode] 5장. 형식 맞추기 (0) | 2020.05.12 |