상세 컨텐츠

본문 제목

7.1. 레코드 캡슐화하기

🍜개발자라면/책을 읽자✍

by :Eundms 2021. 10. 1. 16:58

본문

- 데이터 구조 : 레코드 캡슐화하기 / 컬렉션 캡슐화하기 / 기본형을 객체로 바꾸기

- 리팩터링 시 임시 변수 : 임시 변수를 질의 함수로 바꾸기

여러 함수를 클래스로 묶기 / 클래스 추출하기 / 클래스 인라인하기

위임 숨기기 /  중개자 제거하기

- 함수 캡슐화 : 함수 추출하기 -> 알고리즘 교체하기


- 가변 데이터 => 객체

1) 필드 이름 노출

2) 필드를 외부로부터 숨겨서 내가 원하는 이름을 쓸 수 있는 형태

: 라이브러리에서 해시, 맵, 해시맵, 딕셔너리, 연관 배열

해시맵 - 필드를 명확히 알려주지 않는다.

더보기

범위를 시작 끝 혹은 시작 길이 중 어떤 방식으로 표현하는지 알아내는 유일한 길은 해시맵을 생성하고 사용하는 코드를 직접 확인하는 방법. 해시맵을 생성하고 사용하는 코드를 직접 확인하는 방법 뿐이다.

=>레코드 대신 클래스를 사용

중첩된 리스트나 해시맵을 직렬화하는 경우. 

 


방법

1. 레코드를 담은 변수를 캡슐화한다.

2. 레코드를 감싼 단순한 클래스로 해당 변수의 내용을 교체한다. 이 클래스에 원본 레코드를 반환하는 접근자도 정의하고, 변수를 캡슐화하는 함수들이 이 접근자를 사용하도록 수정한다.

3. 테스트한다.

4. 원본 레코드 대신 새로 정의한 클래스 타입의 객체를 반환하는 함수들을 새로 만든다.

5. 레코드를 반환하는 예전 함수를 사용하는 코드를 4에서 만든 새 함수를 사용하도록 바꾼다. 필드에 접근할 떄는 객체의 접근자를 사용한다. 적절한 접근자가 없다면 추가한다. 한 부분을 바꿀 때마다 테스트한다.

-> 중첩된 구조처럼 복잡한 레코드라면 데이터를 갱신하는 클라이언트들에 주의해서 살펴본다. 클라이언트가 데이터를 읽기만 한다면 데이터의 복제본이나 읽기전용 프락시를 반환할지 고려해보자.

6. 클래스에서 원본 데이터를 반환하는 접근자와 원본 레코드를 반환하는 함수들을 제거한다.

7. 테스트한다.

8. 레코드의 필드도 데이터 구조인 중첩 구조라면 레코드 캡슐하기컬렉션 캡슐화하기재귀적으로 적용한다.

 

 


 레코드 캡슐화하기 

name, country에 접근/수정하기 위해서 getter, setter을 이용하게 한다.

 

// 레코드 캡슐화 전
const organization = {name : "abcmart", country : "kor"}
result +=`<h1>${organization.name}</h1>`;

// 1) 변수 캡슐화
function getRawDataOrganization(){return organization;}
result +=`<h1>${getRawDataOrganization().name}</h1>`;
getRawDataOrganization().name = newName;

// 2) 클래스화
class Organization {
    constructor(data){
        this._name = data.name;
        this._country = data.country;
    }
    set name(aString){this._name = aString;}
    get name(){return this._name;}
    get country(){return this._country;}
    set country(aCountryCode){this._country = aCountryCode;}
}
const organization = new Organization({name : "abcmart", country : "kor"})
// 제거) function getRawDataOrganization(){return organization._data;}
function getOrganization(){return organization;}

 중첩된 레코드 캡슐화하기 

usages를 수정하는 함수(setUsage), usage를 비교하는 함수(compareUsage)를 캡슐화 관점에서 처리하기
더보기
"1920":{ //customerId
    name : "마틴 파울러",
    id : "1920",
    usages : {
        "2016" : {
            "1" : 50,
            "2" : 55,
        },
        "2015" : {
            "1" : 70,
            "2" : 63,
        },
    }
},
"38673":{
    name : "닐 포드",
    id : "38673" 
    ...
}

 

class CustomerData {
    constructor(data){
        this._data = data;
    }
}
function getCustomerData(){return customerData;}
function getRawDataOfCustomers(){return customerData._data;}
function setRawDataOfCustomers(arg){customerData = new CustomerData(arg);}

setUsage(customerID, year, month, amount);

 

 

관련글 더보기

댓글 영역