제임스 그레닝(James Grenning)
패키지 제공자나 프레임워크 제공자는 더 많은 환경에서 돌 수 있도록 적용성을 최대한 넓히려한다.
반면, 사용자는 자신의 요구에 적합한 인터페이스를 바란다.
이로 인해 시스템 경계에서 문제가 생길 소지가 많다.
java.util.Map 의 경우 굉장히 다양한 인터페이스로 수많은 기능을 제공한다.
프로그램에서 Map을 만들어 여기저기 넘긴다고 할 때 Map 사용자라면 누구든지 clear() 메서드를 사용할 수 있다. 즉, 누구나 Map 내용을 지울 권한이 있다는 말이다.
또한 Map 인터페이스가 변할 경우 수정해야 할 코드가 상당히 많아진다.
다음과 같이 경계 인터페이스인 Map을 클래스 안으로 숨길 수 있다.
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
// ...
}
이렇게 하면 Map 인터페이스가 변하더라도 나머지 프로그램에는 영향을 미치지 않는다. 또한 프로그램에 필요한 인터페이스만 제공한다.
→ 코드를 이해하기는 쉬워지고, 오용은 어려워진다.
→ 설계 규칙과 비즈니스 규칙을 따르도록 강제할 수 있다.
Map을 사용할 때마다 캡슐화하라는 말이 아니라 Map과 같은 경계 인터페이스를 여기저기 넘기지 말라는 말이다.