2019년 2월 7일
소프트웨어 리팩토링 (Refactoring)
I. 소프트웨어 코드 정제 기법, 소프트웨어 리팩토링
개념 | 목적 |
---|---|
유지보수 생산성 향상 위해 기능을 변경하지 않고 소스코드를 수정, 보완하는 소프트웨어 품질향상 기법 | – 유지보수성 향상 – 유연한 시스템 – 생산성 향상 – 소프트웨어 품질 향상 |
- Bad Smell 징후 대상 소스코드 정비를 통한 유지보수성, 비용 절감 및 구조개선, 성능 향상
II. 소프트웨어 리팩토링 절차 및 주요 기법
가. 소프트웨어 리팩토링 절차
- 코드 → (배드스멜) → 리팩토링 → (심플코드) → 테스트
- 중복, 불명확한 의미, 복잡한 코드에서 Bad Smell 징후
나. 소프트웨어 리팩토링 주요 기법
주요 기법 | 설명 | 기대 효과 |
---|---|---|
Extract Method | – 그룹으로 묶을 수 있는 코드의 메서드 추출 | – 결합도 감소 |
Extract Class | – 두 개의 클래스 업무를 신규 클래스로 이동 | – 응집도증가 – 결합도 감소 |
Move Method | – 정의된 클래스보다 타 클래스 다수 호출 시 이동 | – 응집도 증가 – 결합도 감소 |
Rename Method | – 메서드 이름이 목적을 드러내도록 이름 변경 | – 가독성 향상 – 유지보수 향상 |
Replace Temp with Query | – 임시 변수 참조 시 메서드 호출로 교체 | – 응집도 증가 – 결합도 감소 |
Full up Field | – 서브 클래스 동일 필드 보유 시 슈퍼 클래스로 이동 | – 중복 제거 |
Full up Method | – 동일 기능 메서드를 슈퍼 클래스로 이동 | – 중복 제거 |
- 코드 인스펙션 및 정적 분석도구 활용과 디자인 패턴 접근
III. 성공적인 리팩토링 수행 방안 및 리엔지니어링과 비교
가. 성공적인 리팩토링 수행 방안
절차도 | 수행 방안 |
---|---|
– 소규모 변경(단일 리팩토링) – 회귀테스트(Retest All) – 테스트 통과 시 단계상승 – 하나라도 미작동 시 Undo |
- 리팩토링의 가장 중요한 사항은 기존 서비스에 영향 없이 안정성 기반 수행 필요
나. 리팩토링과 리엔지니어링 비교
항목 | 리팩토링 | 리엔지니어링 |
---|---|---|
관점 | 모듈의 정제 | 시스템 개선 |
적용 범위 | 클래스, 메서드 단위 | 시스템 등 대단위 |
반복성 | 대다수 반복 | 반복 미발생 |
적용 사례 | 메서드 다형성 적용 | 시스템 전반적 모듈화 |
[참고] 코드스멜
1) 게으른 클래스(Lazy Class): 자식 클래스와 부모 클래스 차이 없으면 합침
2) 추측성 일반화(Speculative Generality): 추측만으로 생성한 클래스는 제거
3) 임시필드(Temporary Field): 파라미터를 줄이기 위한 필드, 메서드는 클래스화
4) 메시지 체인(Message Chain): 특정 객체를 얻기위한 다수 객체는 간소화
5) 미들 맨(Middle Man): 다른 클래스로 위임하는 역할만 담당하는 클래스 검토
6) 부적절한 친밀(Inappropriate Intimacy): 불필요 데이터를 가지고 있는 경우
7) 불완전 라이브러리(Incomplete Library): 불완전 시 필요 부분 추가 구성
8) 거부된 유산(Refused Bequest): 부모클래스의 I/F 거부 시 부모 객체 호출
9) 주석(Comment): 코드 내부 주석은 메서드로 추출해서 설명