[Clean Code] 8. 경계
외부 코드를 사용할때에는 우리코드에 깔끔하게 통합 해야한다.
외부 코드 사용하기
- 경계 인터페이스를 이용할 때는 이를 이용하는 클래스나 클래스 밖으로 노출되지 않도록 주의하자.
- 기존 인터페이스가 수정되어도 코드에 주는 영향을 최소화 하자
Map students = new HashMap(); // Map 인터페이스에서 다양한 기능을 사용할 수 있다.
Student s = (Student)students.get(studentId);
//clear(), containsKey(key), get(key) 등등...
- 기존의 Map에 의존적인 방식
public class Students {
private Map students = new HashMap();
/**
* get(id) 기능만 사용하겠다는 명시적 선언
* @param id
* @return
*/
public Student getById(String id) {
return (Student) Students.get(id);
}
}
- Map을 Students 로 감싼 방식
경계 살피고 익히기
- 외부코드의 기능을 익히기는 어려우며, 항상 통합하기도 어렵다.
- 우리쪽 코드에 라이브러리를 접목시켰을때 에러가 난다면, 우리쪽 에러인지 혹은 라이브러리 버그인지 찾아내는데 골치를 앓기도 한다.
- 간단한 테스트케이스를 작성해 외부 코드를 익혀보자 (학습 테스트)
학습 테스트는 공짜 이상이다
- 학습테스트는 이해도를 높여주는 정확한 방법이다
- 일반 코드의 인터페이스도 테스트 케이스가 필요하다. 이런 경계 테스트는 패키지의 새버전으로 이전하기도 쉬워질 수 있다
- 새버전으 이전시 우리 코드와 호환되지 않으면 학습 테스트가 이를 밝혀낸다
깨끗한 경계
- 통제하지 못하는 코드를 사용할때는 너무 많은 투자를 하거나 향후 변경비용이 지나치게 커지지 않도록 주의하자
- 경계에 위치하는 코드는 깔끔히 분리하고, 가능한 통제가 되는 우리 코드에 의존하는 편이 훨씬 좋다.
- 외부 패키지를 호출할때 위의 방식(Student)로 감싸거나 Adapter 패턴을 사용해 우리가 원하는 인터페이스를 패키지가 제공하는 인터페이스로 변환할 수 있도록 하자.
마치며..
기존의 Map의 방식은 유용하지만 가독성이 떨어진다고 생각했다. 경계를 한번 감싼다는 것으로 필요한 기능을 한정하고 가독성도 좋아질 수 있는 장점 역시 같이 느껴진다. 마지막으로 라이브러리를 사용할때 학습 테스트 코드를 짜려는 습관을 들여야겠다.
Leave a comment