Books/리팩터링 2판

리팩터링 2판 - 7. 캡슐화

PHM 2022. 6. 16. 13:55

7-1. 챕터 소개 & 포인트 정리

- 모듈 : 좋은 아키텍처 설계의 시작

- 캡슐화 : 내부 구현 사항을 숨기고, 외부에서 필요한 사항들만 공개

- 모듈, 클래스와 같은 형태로 캡슐화 해두자!

    ㆍ데이터를 변경하고, 사용하는 코드를 감시할 수 있는 유일한 통로

 

- 함수 하나당, 한가지의 일을 수행하도록 만들어 두자

- 모듈 / 클래스 하나당, 한가지의 책임( 하나의 도메인 ) 을 가지도록 하자

    ㆍ밀접하게 연관된 데이터와 함수들

 

7-2. 불변성 포인트 정리

- 불변성( Immutability ) 

    ㆍ변할 수 없는 전역변수, 레코드, 컬렉션 만들기

- Mutable ( 변할 수 있는 ) : 오류의 상징!?

 

7-3. 레코드 캡슐화하기 ( 책7.1 )

- 컬렉션 : 복합적인 데이터를 가지고 있는 것

    ㆍ배열, 리스트, set

    ㆍ외부로 제공하는 인터페이스로만 접근 가능

- 레코드 : key와 value로 이루어진 것

    ㆍObject, map, dictionary

    ㆍ모듈이나 캡슐화로 해두고 필요한 API제공

    ㆍ외부로 제공하는 인터페이스로만 접근 가능

 

- { ...data } : 얉은 복사, 중복제거

- cloneDeep : 완전한 새로운 객체 반환, 불변성 유지

 

- 기존의 오브젝트를 캡슐화 함으로서 어떤 데이터가 읽기 전용인지, 어떤 데이터가 set할 수 있는지 확인가능

- 의도가 명확해짐

 

7-4. 컬렉션 캡슐화하기 ( 책7.2 )

  removeCourse(course, runIfAbsent){
    const index = this.#courses.indexOf(course);
    if(index===-1) {
      runIfAbsent();
      return;
    }
    this.#courses.splice(index, 1);
  }

- runIfAbsent : 콜백함수

 

- 내부 컬렉션을 외부에 노출하지 않는지 점검

- 인터페이스를 통해서 클래스의 함수를 통해서 노출

 

7-5. 기본형을 객체로 바꾸기 ( 책7.3 )

- 생성자 안에서 에러를 던지는 것은 보안에 취약하다

 

7-6. 임시 변수를 질의 함수로 바꾸기 ( 책7.4 )

7-7. 클래스 추출하기 ( 책7.5 )

- 클래스 하나당 하나의 역할, 하나의 책임, 하나의 도메인을 가지는 것이 좋다.

- 어떤 것이 효율적이고 유지보수성이 높을까? 너무 미래지향적으로 가는 것은 좋지 않다.

7-8. 클래스 인라인하기 ( 책7.6 )

- 관련된 정보를 하나의 클래스로 묶어주면 좀 더 명확해지고 한 곳에서만 담당

- 클래스를 만들때는 밀접하게 관련된 데이터를 하나로 묶어나가는게 중요 ( 응집도 )

- 너무 많은 역할일때는 별도의 클래스로 역할 분리

 

7-9. 위임 숨기기 ( 책7.7 )

- 위임을 숨겨서 외부에서 내부상황을 신경 쓰지 않고 바로 필요한 정보에 접근

 

7-10. 중개자 제거하기 ( 책7.8 )

- 중개자, 위임 : Composition

 

7-11. 알고리즘 교체하기 ( 책7.9 )