Refactoring/Refactoring Skill

[Refactoring 기법 #01] 메서드 정리 - 메서드 추출

JeongKyun 2022. 1. 4.
반응형
※ 오늘의 명언 

아무리 구조가 잘 되어 있더라도,
프로그래머가 나쁜 프로그램을 만드는 걸 막아주는 프로그래밍 언어는 없다.

- Larry Flon, 구조적 프로그래밍에 대한 연구 저자

 

서론


이번 글에서 공부할 내용은 메서드 정리 파트에서 메소드 추출 부분의 내용을 정리할려고 한다. 해당 내용은 간단한 내용이니 부담없이 봐도 좋을 것 같다.

 


 

작성 소스


private string _blog = "";
private string _owner = "";

praivte void printBlogOwner()
{
    //블로그 정보를 불러오는 함수 호출
    inputVal();
    
    //세부 정보 출력하기
    System.out.println("blog" : + _blog);
    System.out.println("owner" : + _owner);    
}

//멤버변수에 값을 넣는 함수
private void inputVal()
{
    _blog = "Tistory";
    _owner = "Jeongkyun";
}

 

위와 같은 소스를 봤을 때 무슨 생각이 드는가? 비록 워낙 간단하게 작성을 해서 이 소스를 굳이 리팩토링을? 하는 생각이 들 수 있다. 하지만 책에선 해당 내용을 이렇게 다뤘다.

 

"어떤 코드를 그룹으로 묶어도 되겠다고 판단이 될 땐 그 코드를 빼내어 목적을 잘 나타내는 이름의 메서드로 만들자"

 

내용을 보면 이제 어디부분을 나눠야할지 느낌이 오지않는가? 아래의 내용을 보기전에 한번 구상해보자.

 

 

 

리팩토링 후 소스


private string _blog = "";
private string _owner = "";

praivte void printBlogOwner()
{
    //블로그 정보를 불러오는 함수 호출
    inputVal();
    
    //세부정보 출력
    printDetailsInfo();
}

//멤버변수에 값을 넣는 함수
private void inputVal()
{
    _blog = "Tistory";
    _owner = "Jeongkyun";
}

//세부 정보를 출력하는 함수
private void printDetailsInfo()
{
    System.out.println("blog" : + _blog);
    System.out.println("owner" : + _owner);    
}

 

전의 소스와 차이는 출력하는 Println을 함수로 빼내어 사용했다는 것이다. 해당 예제 소스가 굉장히 간단해서 그냥 넘어갈 수 있지만 해당 기법처럼 메서드들을 나누다가 보면 지역변수의 사용이 많아 함수를 나누는게 힘든 상황이 닥칠 수 있다. 이럴때는 방법이 두개가 있다.

 

첫번째 방법은 파라미터로 해당 함수로 지역변수의 값을 전달하는 것이고, 나머지 두번째 방법은 해당 지역변수를 사용한 부분을 떼어내어 리턴함수로 만들어 주는것이다. 이해를 돕기위해 아래에 예제를 간략히 적어보겠다.

 


 

[ 지역변수에 의한 파라미터 전달, 리턴 함수 구현 ]


작성 소스 

//1부터 전달받은 length만큼의 합 구하기
praivte void PrintOneToLengthSum(int length)
{   
    
    int sum = 0;
    for(int i = 1; i <= length; i ++)
    {
    	sum += i;
    }
    
    System.out.println("전달 받은 length의 값은 : " : + length);
    System.out.println("모두 더한 sum의 값은 : " : + sum);   
    
}

 

 

 

리팩토링 진행 후 소스

//1부터 전달받은 length만큼의 합 구하기
praivte void PrintOneToLengthSum(int length)
{       
    int sum = Sum(length);
	printSumResult(length, sum);
    
}

//전달 받은 값을 계산하는 함수
private int Sum(int length)
{
    int sum = 0;
    for(int i = 1; i <= length; i ++)
    {
    	sum += i;
    }   
    
    return sum;
}

//결과를 출력하는 함수
private void printSumResult(int length, int sum)
{
    System.out.println("전달 받은 length의 값은 : " : + length);
    System.out.println("모두 더한 sum의 값은 : " : + sum);   
}

 

이런식으로 함수 내부에서 지역변수를 사용하여 나누기 까다롭다고 느껴지는 상황이라면 파라미터로 전달하는 방식 또는 리턴 함수를 만들어 사용하면 해당 문제는 쉽게 해소된다. 

 

 

 

Method 구조

 


 

최종 정리

이 메서드 추출 리팩토링 기법은 함수의 분리이며, 함수를 빼낼때는 함수의 이름을 직관적으로 만들어 유지보수에 용이하게 만드는 것이 포인트이다.

 

이렇게 하여 함수를 나누어 관리하다보면 공통, 중복 소스가 있을 때 해당 함수만 호출하여 재사용할 수 있기에 작업시간이 줄어들고 프로그램 유지보수에도 굉장히 좋아진다.

댓글

💲 많이 본 글