IT/리팩토링

[리팩토링] 객체간 메소드 이동

상쾌한기분 2019. 10. 25. 11:20
반응형

메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 
그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자

클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다.

옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다.

옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다.

 

변경전

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
반응형