profile image

L o a d i n g . . .

캡술화란?

데이터에 대한 접근을 함수로만 한정하는 것

캡슐화의 이점

데이터에 대한 접근을 한정함으로써 의도치 않은 변경을 예방한다.(전역변수/가변데이터)
데이터 입출력시 추가로직을 쉽게 한다. ex) 객체의 사본 제공, 특정 입력 무시

1. 레코드 캡슐화하기

레코드를 데이터 클래스로 전환하기

레코드

간단히 말하자면 구조체
JS 에서 모든 object는 그 자체로 레코드로 사용 가능. HashMap 등으로도 레코드 사용 가능.

레코드 캡슐화의 결과는 결국 레코드를 클래스로 만드는 것.

레코드는 데이터의 집합.
레코드 캡술화는 이 데이터들에 대한 입출력 함수를 만드는 것.
데이터 + 입출력 함수 = 클래스

2. 컬렉션 캡슐화하기

컬렉션 자체를 반환하지 않는다. 복제본을 반환. 읽기 전용으로 제공 등을 이용한다.
컬렉션을 감싼 클래스에 add(), remove() 등의 컬렉션 변경자 메소드를 만든다.

컬렉션

List, Set, Map 등의 타입

3. 기본형을 객체로 바꾸기

굳이 기본형 활용에 집착하지 말고 데이터를 표현하는 전용 클래스를 만들자.

저자는 단순한 출력 이상의 기능이 필요해지는 순간 그 데이터를 표현하는 전용 클래스를 정의한다고 한다.

전용 클래스를 만드는데 노력이 들어 초보 프로그래머에게는 직관에 어긋나 보일 수 있지만, 경험 많은 개발자들은 여러 가지 리팩토링 중에서도 가장 유용한 것으로 손꼽는다고 한다.

4. 임시 변수를 질의 함수로 바꾸기

임시 변수

어떤 코드의 결과값을 다시 참조할 목적으로

질의 함수

호출될 때 그 값을 계산해서 리턴

const basePrice = this._quantity * this._itemPrice;
if (basePrice >1000)
    return ....
else ...
get basePrice() {this._quantity * this._itemPrice;}
if (basePrice >1000)
    return ....
else ...

변수에 값을 한 번 대입한 뒤 더 복잡한 코드 덩어리에서 여러차례 다시 대입하는 경우에는 모두 질의 함수로 추출해야 한다.
클래스 안에서 적용할 때 효과가 크다.

5. 클래스 추출하기

클래스를 반드시 명확하게 추상화하고 소수의 주어진 역할만 처리해야 한다.

언제 추출하는가
특히 클래스의 특정 데이터와 특정 메소드들을 두 분류로 나눌 수 있다면

6. 클래스 인라인하기

5번의 반대. 두 클래스를 하나로 합치기

언제?
1. 특정 클래스에 남은 역할이 거의 없을 때
2. 두 클래스의 기능을 재분배하고 싶을 때: 합하고 역할 재분배 후 나누기

7. 위임 숨기기

위임

객체가 다른 객체를 포함하는 관계

managerId = aPerson.department.manager.id

위임을 숨긴다.

위임 관계인 두 객체를 숨기고, 대신 캡슐화된 함수(메서드)로 접근한다.

manager = aPerson.manager;
class Person {
    get manager() { return this.department.manager;}

위임 숨기기가 안되어 있으면, 메소드를 호출하려면 이 위임객체를 알아야 하고,
이 위임 객체의 인터페이스가 바뀌면 이 인터페이스를 사용하는 모든 클라이언트가 코드를 수정해야 한다.
이러한 의존성을 없애려면 위임 메소드를 만들어서 위임 객체의 존재를 숨긴다. 그러면 위임 객체가 수정되러라도 메소드 코드만 고치면 된다.

8. 중개자 제거하기

7번 반대

9. 알고리즘 교체하기

복사했습니다!