7-6. 클래스 인라인하기
적용 시점
제 역할을 하지 못하는 클래스를 다른 곳으로 넣을 때
두 클래스의 기능을 지금과 다르게 배분하고 싶을 때
절차
소스 클래스의 각 public 메서드에 대응하는 메서드들을 타깃 클래스에 생성한다. 이 메서드들은 단순히 작업을 소스 클래스로 위임해아 한다.
소스 클래스의 메서드를 사용하는 코드를 모두 타깃 클래스의 위임 메서드를 사용하도록 바꾼다. 하나씩 바꿀 때마다 테스트한다.
소스 클래스의 메서드와 필드를 모두 타깃 클래스로 옮긴다. 하나씩 옮길 때마다 테스트한다.
소스 클래스를 삭제한다.
예시
❌Before
class People {
constructor({ name, employeeNumber }) {
this._name = name;
this._employeeNumber = employeeNumber;
}
getName() { return this._name; }
setName(name) { this._name = name; }
getEmployeeNumber() { return this._employeeNumber; }
setEmployeeNumber(employeeNumber) { this._employeeNumber = employeeNumber; }
}
class BoyFreind {
constructor({name, employeeNumber, dueDate, nickname}) {
this._people = new People({ name, employeeNumber });
this._dueDate = dueDate;
this._nickname = nickname;
}
getName() { return this._people.getName() }
setName(name) { this._people.setName(name) }
getEmployeeNumber() { return this._people.getEmployeeNumber() }
setEmployeeNumber(employeeNumber) {
this._people.setEmployeeNumber(employeeNumber)
}
...
}
⭕After
class BoyFreind {
constructor({name, employeeNumber, dueDate, nickname}) {
this._name = name;
this._employeeNumber = employeeNumber;
this._dueDate = dueDate;
this._nickname = nickname;
}
getName() { return this.getName() }
setName(name) { this.setName(name) }
getEmployeeNumber() { return this.getEmployeeNumber() }
setEmployeeNumber(employeeNumber) {
this.setEmployeeNumber(employeeNumber)
}
...
}
Last updated