본문 바로가기
JavaScript│Node js

마틴 파울러 - 리팩토링 - Encapsulate Variable

by 자유코딩 2019. 10. 5.

리팩토링 기법. Encapsulate variable


let defaultOwner = { firstName: 'Martin', lastName: 'Fowler' }


let defaultOwner = { firstName: 'Martin', lastName: 'Fowler' }

export function defaultOwner() { return defaultOwnerData; }

export fuction setDefaultOwner(arg) { defaultOwnerData = arg; }

 

리팩토링은 프로그램의 구성요소를 조작하는 일이다.

데이터를 조작하는 일은 함수를 조작하는 것보다 곤란하다.

 

데이터를 조작하는 게 더 곤란한 이유는 데이터는 함수처럼 동작하지는 않기 때문이다.

만약 데이터를 이동하면 그 데이터에 관한 코드를 모두 고쳐야한다.

데이터가 임시 변수거나 작은 것이면 문제가 되지 않는다. 하지만 커지면 문제가 된다.

데이터를 변수로 만들어서 직접 조작하지 말고 함수를 만들어서 호출하자.

 

이렇게 코드를 고치면 데이터를 조작할 때도 함수를 수정해서 조작하면 된다.

데이터에 대한 검증 로직 , 수정 로직 들을 편리하게 추가 할 수 있다.

 

이렇게 코드를 수정한 상태에서 데이터에는 함수로만 접근 할 수 있도록 한다.

 

요약.

1. 데이터를 접근하고 수정하는 함수 생성

2. 데이터와 함수의 스코프 체크

3. 변수 접근 범위 제한

 

위와 같은 방법으로 하면 데이터를 통째로 변경할 때 쓸 수 있다.

그런데 데이터를 부분적으로 변경하며 조작해야 할 때는 어떻게 해야 할까

const owner1 = defaultOwner();
owner1.lastName = "last name";
owner1.firstName = "first name";

이렇게 변경해줘야 한다.

이럴때 데이터의 사본을 만들어서 client측에서 변경해서 사용하도록 할 수 있다.

 

데이터의 사본 만들기

class 를 만들어서 getter 함수에서 데이터의 사본을 리턴 할 수 있다.

원본 데이터를 건드리지 않고 동작한다.

let defaultOwnerData = { firstName: "Martin" , lastName: "Fowler"}
export function defaultOwner() { return new Person(defaultOwnerData); }
export function setDefaultOwner(arg) { defaultOwnerData = arg; }

class Person{
 constructor(data) {
  this._lastName = data.lastName;
  this._firstName = data.firstName;
  }
 get lastName() { return this._lastName; }
 get firstName() { return this._firstName; }

사본을 만드는 게 성능저하에 미치는 영향은 아주 적다.

그러나 사본을 사용하지 않고 잘못되어서 디버깅 할 때 드는 수고는 크다.

댓글