✏️9.2 필드 이름 바꾸기 (Rename Field)
리팩터링 전
class Organization {
get name() {...}
}
리팩터링 후
class Organization {
get title() {...}
}
🧷 배경
프로그램 곳곳에서 쓰이는 레코드 구조체의 필드 이름은 중요하다. 데이터 구조는 프로그램을 이해하는 데 큰 역할을 한다.
🧷 절차
레코드의 유효 범위가 제한적이라면 필드에 접근하는 모든 코드를 수정한 후 테스트한다. 이후 단계는 필요 없다.
레코드가 캡슐화되지 않았다면 우선 레코드를 캡슐화(7.1절)한다.
캡슐화된 객체 안의 private 필드명을 변경하고, 그에 맞게 내부 메서드들을 수정한다.
테스트한다.
생성자의 매개변수 중 필드와 이름이 겹치는 게 있다면 함수 선언 바꾸기(6.5절)로 변경한다.
접근자들의 이름도 바꿔준다(6.5절).
🧷 예시
// 상수
const organization = {name: '애크미 구스베리', country: 'GB'};
name을 title로 바꿔보자.
organization
레코드를 클래스로 캡슐화한다.
class Organization {
constructor(data) {
this._name = data.name;
this._country = data.country;
}
get name() {return this._name;}
set name(aString) {this._name = aString;}
get country() {return this._country;}
set country(aCountryCode) {this.country = aCountryCode;}
}
const organization = new Organization({name: '애크미 구스베리', country: 'GB'};)
레코드를 캡슐화하면 이름을 변경할 곳이 게터 함수, 세터 함수, 생성자, 내부 데이터 구조 네곳이다.
별도의 필드를 정의하고 생성자와 접근자에서 둘을 구분해 사용하자.
생성자에서 title도 받아들일 수 있도록 한다.
class Organization {
constructor(data) {
this._title = (data.title !== undefined) ? data.title : data.name;
this._country = data.country;
}
get name() {return this._title;}
set name(aString) {this._title = aString;}
get country() {return this._country;}
set country(aCountryCode) {this.country = aCountryCode;}
}
name을 사용할 수 있게 하던 코드를 제거한다.
접근자를 수정한다.
class Organization {
constructor(data) {
this._title = data.title;
this._country = data.country;
}
get title() {return this._title;}
set title(aString) {this._title = aString;}
get country() {return this._country;}
set country(aCountryCode) {this.country = aCountryCode;}
}
가변 데이터 구조를 이용한다면 데이터를 복제하는 것은 재앙이다. 불변 데이터 구조가 널리 쓰이게 된 이유는 재앙을 막기 위해서이다.
Last updated