개발자는 코드를 짤 때, 오로지 자신이 개발한 코드만 사용하는 경우는 드물다. 패키지를 사거나 오픈 소스를 이용하는 경우가 많다. 외부 코드를 가져와서 사용할 때도 깔끔하게 사용해야 한다.
인터페이스 제공자는 최대한 많은 사람에게 제공하고자 하고, 인터페이스 사용자는 자신에게 집중하는 인터페이스를 원하기 때문에 시스템의 경계에는 문제가 생길 여지가 많다.
ex) java.util.Map
clear() void
containsKey(Object key) boolean
containValue(Object value) boolean
isEmpty() boolean
keySet() set
...
Map<String, Sensor> sensors = new HashMap<String, Sensor>();
...
Sensor s = sensors.get(sensorId);
private class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor)sensors.get(id);
}
...
}
외부 코드를 사용하게 되면 많은 기능을 빠르게 출시할 수 있게 된다.
하지만 외부 코드를 익히고 통합하는 것은 어렵다.
=> 간단한 테스트 케이스로 외부 코드를 익히고 사용하도록 한다.
=> 학습 테스트
학습 테스트에 드는 비용은 없다. 학습 테스트는 패키지가 원하는 대로 작동하는지 확인 할 수 있다. 학습 테스트로 빠르게 패키지의 이해도를 높여줄 수 있다.
소프트웨어를 개발할 때 이해하기 어려운 경계와 마주칠 수 있다.
ex) 무선통신 시스템의 소프트웨어 개발
송신기라는 하위 시스템이 존재한다. 송신기 시스템을 책임진 사람들이 아직 구현을 하지 못한 상태이다.
-> 송신기 시스템과 먼 부분부터 구현하기 시작
-> 송신기 시스템은 인터페이스로 정의
=> 필요한 기능을 알아낼 수 있게 된다.
소프트웨어 설계가 잘 된 코드는 변경하는데 큰 노력과 투자가 필요하지 않다.
외부 패키지를 호출하는 코드는 가능한 줄이는 것이 좋다.