객체 간 기능 이동

컴투루·2022년 4월 15일
0

📌 메서드 이동 (Move Method)

좋은 소프트웨어의 핵심은 모듈성!
따라서 메서드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 때 메서드 이동 기법을 이용해서 의존성이 떨어지게 해야함

메서드가 제일 많이 사용하는 클래스에 비슷한 내용의 새 메서드를 작성하고 기존의 메서드는 대리 메서드로 전환하거나 삭제함

✅ 리팩토링 전의 소스

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메서드를 호출 하고 있음


📌 중개자 제거 (Remove Middle Man)

클라이언트가 위임 객체의 또 다른 기능을 사용하고 싶을 때마다 서버에 위임메서드를 추가해야함

이렇게 추가하다보면 단순히 전달만 하는 위임메서드들이 성가셔짐
그리고 서버클래스는 그저 중개자 역할로 전락해버림

이럴때 중개자 제거 기법을 이용해서 클라이언트가 직접 호출하도록 함

✅ 리팩토링 전의 소스

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/

profile
맘 먹으면 못할 게 없지

0개의 댓글