I. 구조개선을 통한 SW 품질향상, 리팩토링 개요
-. 코딩 오류 가능성을 최소화하기 위해 프로그램 내에서 이해하기 어렵고, 수정하기 힘들며, 확장하기 어려운 코드를 원래 기능을 그대로 두면서 내부구조를 개선하는 활동
-. 소프트웨어 모듈의 외부적 기능은 수정하지 않고 내부적 구조, 관계 등을 단순화하여 소프트웨어의 유지 보수성을 향상시키는 품질 향상 기법
-. 소프트웨어를 보다 쉽게 이해할 수 있고 유지보수를 용이하게 할 수 있도록 겉으로 보이는 동작의 변화 없이 내부 구조를 변화시키는 활동
-. 소프트웨어의 이해성 및 유지보수성을 높이기 위해 code smell을 제거하여 동작의 변화없이 내부구조를 변경하는 활동
-. 결과의 변경 없이 코드의 구조를 재조정하여 가독성을 높이고, 유지보수를 편하게 하는 유지보수 행위
-. 소프트웨어의 행위(behavior)를 보전하면서 프로그램의 가독성, 구조, 성능, 유지보수성 등을 향상시키는 품질향상 기법
-. 목적: 유지보수성 향상, 유연한 시스템, 생산성 향상, 품질향상
II. 리팩토링 기법 및 절차
가. 리팩토링 기법
구분 | 기법 | 설명 |
메소드 정리 | Extract Method | 그룹으로 묶을 수 있는 코드 조각이 있다면 특성을 잘 드러내도록 네이밍하여 메쏘드로 추출 |
Replace Temp With Query |
어떤 수식의 결과값을 저장하기 위해 임시 변수를 사용한다면 수식을Method로 만들고, 임시 변수를 참조하는 곳을 모두method 호출로 수정 | |
객체간 기능이동 | Move Method | Method가 자신이 정의된 클래스보다 다른 클래스에서Method 더 많이 사용하고 있으면Move 해야 함 |
Extract Method | 두개의 클래스가 해야 할 일을 하나의 클래스가 하고 있다면 클래스 분리 | |
메소드 호출 단순화 | Rename Method | Method name이 그 목적을 드러내지 못할 때 메소드 이름 변경 |
Remove Parameter | 불필요한 파라미터를 제거 | |
클래스/메소드 일반화 | Pull up field | 두 서브클래스가 동일한 필드를 가지고 있다면 그 필드를 수퍼클래스로 올림 |
Pull up Method | 동일한 일을 하는 메소드를 여러 서브 클래스에서 가지고 있다면 이 메소드를 수퍼클래스로 올림 | |
기타 | Encapsulation field | Public 필드가 있는 경우 그 필드를private로 만들고 접근자를 제공 |
Deompose Conditional | 조건 논리를 단순화하여 표현 |
나. 리팩토링 절차
-. 리팩토링 대상 식별: 메소드 파라미터, 리턴 값, 입력 값 처리 내부 버퍼 범위 확인
-. 테스트를 통한 적용:소규모 변경 후 정상 작동 여부를 확인하여 다음 단계로 넘어가고 그렇지 않으면Undo 후 리팩토링
-. 중복, 의미 불명확, 복잡한 코드에서 나타나는 징후가 Bad Smell
III. 리팩토링시 고려사항
구분 | 내용 |
데이터베이스 | 대부분 비즈니스 어플리케이션과DB 스키마가 밀접하게 결합되어 있고, 데이터 마이그레이션도 어려움이 있음 |
인터페이스 변경 | 완전하지 않은 인터페이스로 인해 시스템 불안정 초래 |
리팩토링이 어려운 디자인 변경 | 리팩토링에 적합하지 않은 디자인 존재 |
-. 마감이 임박할 경우 리팩토링 금지, 코드를 첨부터 다시 작성해야 하는 경우 리팩토링 금지
IV. 리팩토링과 리엔지니어링 비교
구분 | 리팩토링 | 리엔지니어링 |
관점 | 모듈의 정제 | 현 시스템을 개선(기능) |
적용범위 | 클래스, 모듈 등 소단위 | 시스템, 기능 등 대단위 |
반복성 | 반복 많음 | 반복이 거의 없음 |
적용사례 | 특정 메소드에 대한 다형성 적용 | 시스템의 전반적 모듈화 |