외부 코드를 깔끔하게 통합할 수 있는 '경계'를 깔끔하게 처리하는 기법과 기교를 살펴보자.
Using Third-Party Code
인터페이스 제공자는 적용성을 최대한 넓히려 하고,
인터페이스 사용자는 자신의 요구에 집중한다.
java.util.Map 사용 예시
1️⃣ sensors라는 객체를 담는 Map 생성
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
2️⃣ 제네릭스 사용
Map<String, Sensor> sensors = new HashMap<Sensor>();
Sensor s = sensors.get(sensorId);
3️⃣ Map을 좀 더 깔끔하게 사용
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
// 이하 생략
}
✔ Map과 같은 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 계열 밖으로 노출되지 않도록 주의한다.
✔ Map 인스턴스를 공개 API의 인수로 넘기거나 반환값으로 사용하지 않는다.
Exploring and Learning Boundaries
Learning log4j
public class LogTest {
private Logger logger;
@Before
public void initialize() {
logger = Logger.getLogger("logger");
logger.removeAllAppenders();
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void basicLogger() {
BasicConfigurator.configure();
logger.info("basicLogger");
}
@Test
public void addAppenderWithStream() {
logger.addAppender(new ConsoleAppender(new ParrenLayout("%p %t %m%n"), ConsoleAppender.SYSTEM_OUT));
logger.info("addAppenderWithStream");
}
@Test
public void addAppenderWithoutStream() {
logger.addAppender(new ConsoleAppender(new PatternLayout("%p %t %m%n")));
logger.intfo("addAppenderWithoutStream");
}
}
Learning Tests Are Better Than Free
Using Code That Does Not Yet Exist
Clean Boundaries
📖 느낀점
Map을 쓸 때 java에서 제공하는 Map 인터페이스가 바뀔거라는 생각을 해본 적이 없었다.
너무 당연하게 항상 같게 제공할거라는 안일한 생각을 하고 있었다는 점에서 반성을 하게 되었다.
경계 인터페이스를 이용할 때 Wrapper 클래스 안에 숨기는 것은 앞으로 구현할 때 큰 도움이 될 것 같다.