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

2019. 10. 25. 11:20·IT/리팩토링
반응형

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

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

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

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

 

변경전

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/리팩토링' 카테고리의 다른 글
  • 리팩토링 - 코드 개선 방법
  • [리팩토링] 클래스 멤버변수 이동
  • [리팩토링] 메소드를 메소드 객체로 전환
  • [리팩토링] 매개변수로의 값 대입 제거
상쾌한기분
상쾌한기분
  • 상쾌한기분
    상쾌한기분
    상쾌한기분
  • 전체
    오늘
    어제
    • 분류 전체보기 (251)
      • Python (44)
        • Python (26)
        • Django (6)
        • Flask (4)
        • Open Source (6)
      • Kotlin & Java (5)
        • Spring (2)
        • 프로젝트 (1)
      • Go (11)
      • Database (24)
        • MySQL (21)
        • Redis (3)
      • Infrastructure (2)
        • CDC (4)
        • Kafka (5)
        • Prometheus (2)
        • Fluentd (11)
        • Docker (1)
        • Airflow (2)
        • VPN (2)
      • IT (26)
        • AI (9)
        • Langchain (8)
        • Web (18)
        • Git (8)
        • 리팩토링 (9)
        • Micro Service Architecture (8)
        • Clean Code (16)
        • Design Pattern (0)
        • 수학 (1)
        • 알고리즘 (14)
      • OS (14)
        • Centos (10)
        • Ubuntu (3)
        • Mac (1)
      • Search Engine (2)
        • ElasticSearch (1)
        • Lucene Solr (1)
      • PHP (2)
        • Laravel (1)
        • Codeigniter (1)
  • 블로그 메뉴

    • Github 방문
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    티스토리챌린지
    git
    python
    Redis
    Kafka
    ollama
    go
    fluentd
    LLM
    http
    Langchain
    prompt
    Golang
    MYSQL
    performance
    오블완
    백준
    CDC
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상쾌한기분
[리팩토링] 객체간 메소드 이동
상단으로

티스토리툴바