※ 리팩토링

◆ 정의

소프트웨어 공학에서 '결과의 변경 없이 코드의 구조를 재조정함' 을 뜻한다. 주로 가독성을 높이고 유지보수를 편하게 한다. 버그를 없애거나 새로운 기능을 추가하는 행위는 아니다.

사용자가 보는 외부 화면은 그대로 두면서 내부 논리나 구조를 바꾸고 개선하는 유지보수 행위이다.


◆ 목적

· 버그를 찾아내기 쉽게 한다. (디버깅 자체는 리팩토링이 아니지만, 리팩토링을 하면 프로그램이 정리되어 숨어 있는 버그를 찾아내기 쉬워진다.)


· 기능을 추가하기 쉽게 한다. (기능 추가 자체는 리팩토링이 아니지만 리팩토링을 하면 프로그램에 새호운 기능을 추가하기 쉬워 진다. 리팩토링이 되지 않은 코드는 일반적으로 기능을 추가하면 소스코드가 점점 더 복잡해지고 결국 구조가 무너진 소스가 된다. 하지만 리팩토링을 한 코드는 탄탄한 구조를 갖게 되어 기능추가에 있어서 편할 것이다.)


· 리뷰하는 것이 쉬워진다. (리팩토링하여 깨끗해진 코드는 읽기 쉽고 이해하기 쉬워진다. 이는 결국 코드리뷰에 있어서 쉬워짐을 의미한다.)


◆ 리팩토링의 예제

1. 메소드 정리 

(1) Extract Method

그룹으로 묶을 수 있는 코드 조각이 있으면 별도의 메소드로 뽑아낸다. 코드의 목적이 잘 들어나는 메소드의 이름을 짓는다


(2) Inline Method

호출하는 곳에 메소드의 몸체를 넣고 메소드를 삭제한다.


(3) Inline Temp

간단한 수식의 결과값을 가지는 임시변수를 모두 원래의 수식으로 바꾼다.


(4) Replace Temp With Query

어떤 수식의 결과 값을 저장하기 위해서 임시 변수를 사용하고 있다면 이 수식을 뽑아서 새로운 메소드로 만들고 임시변수를 모두 찾아서 메소드 호출로 바꾼다.


(5) Introduce Explaining Variable

복잡한 수식이 있는 경우, 수식의 결과나 수식의 일부에 자신의 목적을 잘 설명하는 이름으로 된 임시변수를 사용한다.


(6) Split Temporary Variable 

임시변수에 값을 여러 번 대입하는 경우, 각각의 대입에 대해서 따로따로 임시변수를 만든다.


(7) Remove Assignments to Parameters

파라미터에 값을 할당하는 코드가 있으면 임시변수를 사용한다.


(8) Substitute Algorithm

알고리즘을 보다 명확한 것으로 바꾸고 싶을 때는 메소드의 몸체를 새로운 알고리즘으로 바꾼다.


2. 객체간의 기능 이동

(1) Move Method

메소드가 자신이 정의된 클래스보다 다른 클래스의 기능을 더 많이 사용하고 있다면, 이 메소드를 가장 많이 사용하고 있는 클래스에 비슷한 몸체를 가진 새로운 메소드를 만들고 이전 메소드는 간단한 위임으로 바꾸거나 완전히 제거한다.


(2) Move Field

필드가 자신이 정의된 클래스보다 다른 클래스에 의해서 더 많이 사용되고 있다면, 타켓 클래스에 새로운 필드를 만들고 기존 필드를 사용하고 있는 모든 부분을 변경한다.


(3) Extract Class

두 개의 클래스가 해야 할 일을 하나의 클래스가 하고 있는 경우, 새로운 클래스를 만들어서 관련 있는 필드와 메소드를 예전 클래스에서 새로운 클래스로 옮긴다.


(4) Inline Class

클래스가 하는 일이 많지 않은 경우에는, 그 클래스에 있는 모든 변수와 메소드를 다른 클래스로 옮기고 그 클래스를 제거하라.


3. 데이터의 구성

데이터를 좀 더 쉽게 다루기 위한 여러가지 리팩토링이다.

(1) Self Encapsulate Field

필드에 직접 접근하고 있는데 필드에 대한 결합이 이상해지면 get/set 메소드를 만들어 필드에 접근한다.


(2) Change Value to Reference

동일한 인스턴스를 여러 개 가지고 있는 클래스가 있고 여러개의 동일한 인스턴스를 하나의 객체로 바꾸고 싶으면 그 객체를 참조객체로 바꾸어라.


(3) Replace Array with Object

배열의 특정 요소가 다른 뜻을 가지고 있다면, 배열을 각각의 요소에 대한 필드를 가지는 객체로 바꾼다.


◆ 리팩토링의 한계

리팩토링은 언제라도 가능한 것은 아니다. 리팩토링을 적용할 수 없는 경우도 있다.


· 프로그램이 아직 동작하지 않는 경우

만들고 있는 중이라 아직 동작하지 않는 프로그램은 리팩토링 할 수 없다. 리팩토링하기 전에 먼저 동작하는 프로그램을 만들어야만 하며, 또한 설계와 코딩이 좋지 않아 버그투성인 사용할 수 없는 프로그램에 대해서도 리팩토링 할 수 없다.

· 시간이 얼마 남지 않았을 경우 (마감일에 가까워 졌을 때)

납기 기간이 매우 엄격한 코드를 리팩토링하는 것은 현명한 방법이 아니다. 리팩토링이라는 것은 시간이 지나면서 차차 효과가 나타나는 것이다. 또한 납기 직전에 커다란 리팩토링은 하지 않도록 하는 것이 좋다.

'소프트웨어 공학' 카테고리의 다른 글

프로젝트 조직  (0) 2017.10.22
소프트웨어 개발론  (0) 2017.10.21

+ Recent posts