728x90
반응형
메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐
그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자
클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다.
옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다.
옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다.
변경전
class Account
{
private AccountType _accountType;
private int _dayOverdrawn;
double getOverdraftCharge()
{
if ( _accountType.isPremium() )
{
double result = 10;
if ( _dayOverdrawn > 7 )
{
result += ( _dayOverdrawn -7 ) * 0.85;
}
return result;
}
return _dayOverdrawn * 1.75;
}
double getBankCharge()
{
double result = 4.5;
if ( _dayOverdrawn > 0 )
{
result += getOverdraftCharge();
}
return result
}
}
해당 메소드를 위임코드로 변환한 경우
class Account
{
private AccountType _accountType;
private int _dayOverdrawn;
/* 이하 위임 코드 : 해당 메소드가 여전히 필요할수 있다. 위임 코드로 변환 하자 */
double getOverdraftCharge()
{
return _accountType.getOverdraftCharge();
}
/* 이상 위임코드 */
double getBankCharge()
{
double result = 4.5;
if ( _dayOverdrawn > 0 )
{
result += getOverdraftCharge();
}
return result
}
}
class AccoutType
{
double getOverdraftCharge( int dayOverdrawn )
{
if ( isPremium() )
{
double result = 10;
if ( dayOverdrawn > 7 )
{
result += ( dayOverdrawn -7 ) * 0.85;
}
return result;
}
return dayOverdrawn * 1.75;
}
}
해당 메소드를 삭제한 경우
class Account
{
private AccountType _accountType;
private int _dayOverdrawn;
double getBankCharge()
{
double result = 4.5;
if ( _dayOverdrawn > 0 )
{
result += _type.getOverdraftCharge(_dayOverdrawn);
}
return result
}
}
class AccoutType
{
double getOverdraftCharge( int dayOverdrawn )
{
if ( isPremium() )
{
double result = 10;
if ( dayOverdrawn > 7 )
{
result += ( dayOverdrawn -7 ) * 0.85;
}
return result;
}
return dayOverdrawn * 1.75;
}
}
클래스를 전달해서 처리하는 경우
class Account
{
private AccountType _accountType;
private int _dayOverdrawn;
double getBankCharge()
{
double result = 4.5;
if ( _dayOverdrawn > 0 )
{
result += _type.getOverdraftCharge(_dayOverdrawn);
}
return result
}
}
class AccoutType
{
double getOverdraftCharge( Account account )
{
if ( isPremium() )
{
double result = 10;
int dayOverdrawn = account.getDayOverdrawn();
if ( dayOverdrawn > 7 )
{
result += ( dayOverdrawn -7 ) * 0.85;
}
return result;
}
return dayOverdrawn * 1.75;
}
}
728x90
반응형
'IT > 리팩토링' 카테고리의 다른 글
리팩토링 - 코드 개선 방법 (0) | 2019.10.25 |
---|---|
[리팩토링] 클래스 멤버변수 이동 (0) | 2019.10.25 |
[리팩토링] 메소드를 메소드 객체로 전환 (0) | 2019.10.25 |
[리팩토링] 매개변수로의 값 대입 제거 (0) | 2019.10.25 |
[리팩토링] 직관적 임시변수 사용 (0) | 2019.10.25 |