좋은 소프트웨어의 핵심은 모듈성!
따라서 메서드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 때 메서드 이동 기법을 이용해서 의존성이 떨어지게 해야함
메서드가 제일 많이 사용하는 클래스에 비슷한 내용의 새 메서드를 작성하고 기존의 메서드는 대리 메서드로 전환하거나 삭제함
class Account{
private AccountType type;
private int daysOverdrawn;
double overdraftCharge() {
if(type.isPremium()) {
double result = 10;
if(daysOverdrawn > 7) {
result += (daysOverdrawn -7) * 0.85;
}
return result;
}
else{
return daysOverdrawn * 1.75;
}
}
double bankCharge() {
double result = 4.5;
if(daysOverdrawn > 0) {
result += overdraftCharge();
}
return result;
}
}
Account클래스에는 계좌 유형마다 당좌대월 금액을 계산하는 기능이 있는데 나중에 새로운 계좌 유형이 추가되면 각 유형마다 계산방식이 달라지게 됨
따라서 이러한 계산을 하는 overdraftCharge를 AccountType 클래스로 이동시킴
class Account{
private AccountType type;
private int daysOverdrawn;
double bankCharge() {
double result = 4.5;
if(daysOverdrawn > 0) {
result += type.overdraftCharge(daysOverdrawn);
}
return result;
}
}
class AccountType(){
double overdraftCharge(int daysOverdrawn) {
if(isPremium()) {
double result = 10;
if(daysOverdrawn > 7) {
result += (daysOverdrawn -7) * 0.85;
}
return result;
}
else{
return daysOverdrawn * 1.75;
}
}
}
리팩토링 후 bankCharge메서드가 AccountType클래스의 overdraftCharge메서드를 호출 하고 있음
클라이언트가 위임 객체의 또 다른 기능을 사용하고 싶을 때마다 서버에 위임메서드를 추가해야함
이렇게 추가하다보면 단순히 전달만 하는 위임메서드들이 성가셔짐
그리고 서버클래스는 그저 중개자 역할로 전락해버림
이럴때 중개자 제거 기법을 이용해서 클라이언트가 직접 호출하도록 함
manager = aPerson.manager
class Person {
get manager(){
return this.department.manager
}
}
manager = aPerson.department.manager
📑 References
https://armadillo-dev.github.io/book/refactoring-07-moving-features-between-objects/