책에서 말하는 캡슐화란? 데이터 접근을 함수로만 한정하는 것을 말한다.
이점 1. 데이터에 대한 접근을 한정하면서 의도치 않은 변경을 예방한다.
이점 2. 데이터 입출력시 로직 추가가 쉽다.
1. 레코드 캡슐화하기
레코드란? 데이터를 표현하는 기본적인 자료 구조를 말한다.
const date = { year: 2021, month: 11, day: 21 };
레코드 캡슐화란 이러한 데이터에 대한 입출력을 제한하는 함수를 만드는 것이다.
변수 자체는 물론, 그 내용을 조작하는 방식도 통제하기 위해서 레코드를 캡슐화한다.
2. 컬렉션 캡슐화하기
컬렌션이란? List, Map, Set 같은 자료형을 말한다.
저자는 가변 데이터는 모두 캡슐화하는 편이다. 데이터 구조가 언제 어떻게 수정되는지 파악하기 쉬워서 필요한 시점에 데이터 구조를 변경하기도 쉬워지기 때문이다.
ℹ️ 컬렉션을 캡슐화하는 방법 세가지
- 컬렉션을 절대로 반환하지 않는다.
- 컬렉션을 읽기 전용으로 제공한다.
- 복제본을 반환한다. (*흔히 사용되는 방식)
3. 기본형을 객체로 바꾸기
전화번호를 표현할 때, 처음엔 문자열로만 표현하다가 나중에는 번호를 포매팅하거나 지역코드만 추출할 일이 생길 수 있다. 책에 나와있는 예시를 코드로 옮겨보았다.
ℹ️ 리팩터링 전
const telephoneNumber = "021234567";
ℹ️ 리팩터링 후
class TelephoneNumber {
constructor(string){
this.value = string;
}
getTelephoneNumber() { return this.value; }
getDisplayPhoneNumber() { return this.value.replace(/(\w{2})(\w{3})(\w{4})/g, "$1-$2-$3"); }
getAreaCode() { return this.value.slice(0, 2); }
}
실제 사용되는 코드라면 지역코드를 세세하게 따져야겠지만 그러지 못하고 간략하게 2자리로 가정하였다.
참고) instanceof 의 쓰임
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/instanceof
// 생성자 정의
function C(){}
function D(){}
var o = new C();
// true, 왜냐하면 Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// false, 왜냐하면 D.prototype이 o 객체의 프로토타입 체인에 없음
o instanceof D;
4. 임시 변수를 질의 함수로 바꾸기
임수변수란? 어떤 코드의 결괏값을 뒤에서 다시 참조할 목적으로 쓰는 변수이다.
질의 함수란? 위의 결괏값을 호출될 때마다 그때 그때 계산해서 리턴하는 것이다.
ex) 쇼핑몰에서 쿠폰 적용이나 배달비 계산을 할 때, 매번 고객이 장바구니에 담은 물건의 총 금액을 불러와야할 것이다.
5. 클래스 추출하기 (↔️ 클래스 인라인하기)
클래스가 다중의 역할을 수행하고 있다면 둘로 쪼개야한다.
6. 클래스 인라인하기 (↔️ 중개자 제거하기)
특정 클래스에 남은 역할이 거의 없을 때 인라인하자.
두 클래스의 기능을 지금과 다르게 배분하고 싶을 때도 인라인하자.
7. 위임 숨기기 (↔️ 클래스 추출하기)
위임이란? 객체가 다른 객체를 포함하는 관계를 말한다.
아래 예시를 보면 manager id를 가져오기 위해서 여러 단계를 거쳐야한다.
managerId = aPerson.department.manager.id;
이렇게 위임을 여러번 거치면 이 코드를 사용하는 모든 곳에서 단계를 세 번이나 거쳐야한다는 것을 알고 있어야하는 단점이 있다.
만약 객체가 잘 캡슐화되어 있다면 id를 가져오는 메소드 하나만 수정하면 된다.
8. 중개자 제거하기 (↔️ 위임 숨기기)
위임 객체가 지나치게 많아진다면 클래스가 그저 중개자로 전락할 수 있다.
class Person = {
getManagerId()
getManagerName()
getManagetDepartment()
...
}
'Today I Learned' 카테고리의 다른 글
리팩터링 2판 챕터9 - 데이터 조직화 (0) | 2021.12.12 |
---|---|
리팩터링 2판 챕터8 - 기능 이동 (0) | 2021.11.29 |
리팩터링 2판 챕터6 - 기본적인 리팩터링(2) (0) | 2021.11.21 |
리팩터링 2판 챕터6 - 기본적인 리팩터링(1) (0) | 2021.11.15 |
리팩터링 2판 챕터4 - 테스트 구축하기 (0) | 2021.11.14 |