[개발도서] CleanCode 8장

2 분 소요

Clean Code 책 8장 경계를 읽고…

경계

우리 코드와 외부 코드를 통합할 때 생기는 연결점을 경계라고 한다. 경계 처리는 존재하는 코드(외부 라이브러리)와 존재하지 않는 코드(작성 예정된 코드) 2가지로 나눌 수 있다.

  1. 존재하는 코드(외부 라이브러리)

    외부 라이브러리 경계는 캡슐화를 통해 처리를 할 수 있다. 이 때 생기는 이점은 2가지다.

    1. 외부 라이브러리에서 필요한 기능 및 자료형을 사용하도록 사용자에게 제한

      예시 ) Sensor 클래스를 만들어 외부 라이브러리 Map 캡슐화

      ​ Map의 자료형을 Sensor로 기능(메서드)은 get으로 제한한다.

      public class Sensor {
      	private Map sensors = new HashMap();
            	
      	public Sensor getById(String id) {
      		return (Sensor) sensors.get(id);
      	}
      }
      
    2. 코드를 통제할 수 있는 영역으로 만듦

      외부 라이브러리가 업데이트, 버그 픽스 등을 통해 변경될 수 있다. 이 같은 경우 외부 라이브러리를 사용하는 개발자들이 통제할 수 없는 영역이라 수정된 클래스나 메서드가 사용된 부분을 일일히 변경해줘야 하는 문제가 발생할 수 있다. 그래서 캡슐화를 통해 우리 코드와 외부 코드의 경계선을 만들어줘야 한다.

      // 이후 Map의 기능이 변경될 경우, 사용된 곳은 제외하고 메서드 내부만 변경하면 된다.
      private Map sensors = new HashMap();
            
      public Sensor getById(String id) {
      	return (Sensor) sensors.get(id);
      }
      
  2. 존재하지 않는 코드(작성 예정 코드)

    다른 팀과 협업을 할 때 서로의 프로그램이나 모듈을 합쳐야하는 경우가 있다. 그리고 협업 팀이 아직 설계만 되어 있고 코드가 미 작성되어 있을 때 우리 개발은 계속 진행되어야 할 때가 있다. 이 때 우리는 경계 부분의 코드를 작성해서 사용하다가 이후에 협업 팀 코드가 작성이 되면 어뎁터 코드 작성을 통해 양쪽 코드를 연결해 줄 수 있다.

    /**
     * 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장 경계를 통해 외부 라이브러리를 사용과 협업 팀 코드 연결을 할 때 깔끔하게 처리할 수 있는 방법에 대해서 공부할 수 있었다. 차주 독서 모임 때는 코드를 통해서 리팩토링 해 실제 적용하는 시간을 가져 익히는 시간을 가질 것이다.

카테고리:

업데이트: