[개발도서] CleanCode 8장
Clean Code 책 8장 경계를 읽고…
경계
우리 코드와 외부 코드를 통합할 때 생기는 연결점을 경계라고 한다. 경계 처리는 존재하는 코드(외부 라이브러리)와 존재하지 않는 코드(작성 예정된 코드) 2가지로 나눌 수 있다.
-
존재하는 코드(외부 라이브러리)
외부 라이브러리 경계는 캡슐화를 통해 처리를 할 수 있다. 이 때 생기는 이점은 2가지다.
-
외부 라이브러리에서 필요한 기능 및 자료형을 사용하도록 사용자에게 제한
예시 ) Sensor 클래스를 만들어 외부 라이브러리 Map 캡슐화
Map의 자료형을 Sensor로 기능(메서드)은 get으로 제한한다.
public class Sensor { private Map sensors = new HashMap(); public Sensor getById(String id) { return (Sensor) sensors.get(id); } }
-
코드를 통제할 수 있는 영역으로 만듦
외부 라이브러리가 업데이트, 버그 픽스 등을 통해 변경될 수 있다. 이 같은 경우 외부 라이브러리를 사용하는 개발자들이 통제할 수 없는 영역이라 수정된 클래스나 메서드가 사용된 부분을 일일히 변경해줘야 하는 문제가 발생할 수 있다. 그래서 캡슐화를 통해 우리 코드와 외부 코드의 경계선을 만들어줘야 한다.
// 이후 Map의 기능이 변경될 경우, 사용된 곳은 제외하고 메서드 내부만 변경하면 된다. private Map sensors = new HashMap(); public Sensor getById(String id) { return (Sensor) sensors.get(id); }
-
-
존재하지 않는 코드(작성 예정 코드)
다른 팀과 협업을 할 때 서로의 프로그램이나 모듈을 합쳐야하는 경우가 있다. 그리고 협업 팀이 아직 설계만 되어 있고 코드가 미 작성되어 있을 때 우리 개발은 계속 진행되어야 할 때가 있다. 이 때 우리는 경계 부분의 코드를 작성해서 사용하다가 이후에 협업 팀 코드가 작성이 되면 어뎁터 코드 작성을 통해 양쪽 코드를 연결해 줄 수 있다.
/** * Java code sample */ /* the client class should instantiate adapter objects */ /* by using a reference of this type */ interface Stack<T> { void push (T o); T pop (); T top (); } /* DoubleLinkedList is the adaptee class */ class DList<T> { public void insert (DNode pos, T o) { ... } public void remove (DNode pos) { ... } public void insertHead (T o) { ... } public void insertTail (T o) { ... } public T removeHead () { ... } public T removeTail () { ... } public T getHead () { ... } public T getTail () { ... } } /* Adapt DList class to Stack interface is the adapter class */ class DListImpStack<T> extends DList<T> implements Stack<T> { public void push (T o) { insertTail (o); } public T pop () { return removeTail (); } public T top () { return getTail (); } } // 출처 : https://ko.wikipedia.org/wiki/%EC%96%B4%EB%8C%91%ED%84%B0_%ED%8C%A8%ED%84%B4
결론
8장 경계를 통해 외부 라이브러리를 사용과 협업 팀 코드 연결을 할 때 깔끔하게 처리할 수 있는 방법에 대해서 공부할 수 있었다. 차주 독서 모임 때는 코드를 통해서 리팩토링 해 실제 적용하는 시간을 가져 익히는 시간을 가질 것이다.