※ 오늘의 명언
아무리 구조가 잘 되어 있더라도,
프로그래머가 나쁜 프로그램을 만드는 걸 막아주는 프로그래밍 언어는 없다.
- 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);
}
이런식으로 함수 내부에서 지역변수를 사용하여 나누기 까다롭다고 느껴지는 상황이라면 파라미터로 전달하는 방식 또는 리턴 함수를 만들어 사용하면 해당 문제는 쉽게 해소된다.
최종 정리
이 메서드 추출 리팩토링 기법은 함수의 분리이며, 함수를 빼낼때는 함수의 이름을 직관적으로 만들어 유지보수에 용이하게 만드는 것이 포인트이다.
이렇게 하여 함수를 나누어 관리하다보면 공통, 중복 소스가 있을 때 해당 함수만 호출하여 재사용할 수 있기에 작업시간이 줄어들고 프로그램 유지보수에도 굉장히 좋아진다.
'Refactoring > Refactoring Skill' 카테고리의 다른 글
[Refactoring 기법 #05] 메서드 정리 - 알고리즘 전환 (0) | 2022.01.16 |
---|---|
[Refactoring 기법 #04] 메서드 정리 - 임시변수를 메서드 호출로 전환 (0) | 2022.01.11 |
[Refactoring 기법 #03] 메서드 정리 - 임시변수 내용 직접 삽입 (0) | 2022.01.09 |
[Refactoring 기법 #02] 메서드 정리 - 메서드 내용 직접 삽입 (0) | 2022.01.09 |
[Refactoring] 리팩토링(Refactoring)이란? (리팩토링 효과 / 해야 하는 이유) (0) | 2022.01.03 |
댓글