소프트웨어를 개발하는 프로그래머라면 누구나 Refactoring 의 필요성을 공감하지만
실제 Refactoring을 하는 건 솔직히 엄두가 안난다.. 왜냐.. 괜히 잘 돌아가는 프로그램을
건드렸다가 에러라도 나면 어쩌나 하는 두려움이 들기 때문이다.
처음부터 코딩을 할때 어떤 코딩 Rule을 지키면서 한다면 그나마 refactoring 할 이유가
적어지지만 실제 코딩을 하다보면 결국 소스가 흔히 말하는 지저분하게 될수 밖에 없다.
중복되는 소스, 하나의 Function에 많은 기능을 구현, 캡슐화 대신 직접 멤버변수 참조 등
의 코딩 (Code Smell) 을 하게 된다는 말이다..
간단하게 Refactoring의 사례를 살펴보면 다음과 같아.
- 기능변화 없이 중복제거, 단순화, 유연성 추가
1.Method 정의 - 지나치게 긴 Method 를 분리
- 지나치게 긴 문장을 Method를 사용하여 단순화
2.위치이동 - Method난 변수 위치를 적절한 Class로 이동
3.캡슐화 - 멤버변수를 Get/Set 사용하여 캡슐화
4.조건문 단순화 - 긴 조건문을 분할하거나 method 화 하여 단순화
5.이름변경 - 이해하기 쉬운 이름으로 변경
6.Indentation - 가독성이 있는 Indent로 재포맷
Refactoring 정의 및 개념
1. 원래 기능은 유지하면서 낮은 가독성, 중복된 로직, 확장 제한적 코드 등
(코드 스멜, Code Smell)을 제거함으로써 SW 내부 구조를 개선하여 코드 품질을 향상시키는
SW 개선 기법
2. 외부 기능을 변경하지 않으면서 내부 구조를 개선하는 방법으로, Refactoring을 할 때는 기능을
추가해서는 안 되고, 단지 코드의 구조에만 신경을 써야 한다.
Refactoring 대상 , Code Smell 종류
Code Smell | 설명 | 방법 |
중복된 코드 | 소스 코드가 중복됨. | 중복된 코드를 제거 공통 Function 으로 변경 |
긴 Method | Method의 내부 소스가 너무 긴 경우 | 적정 소스 크기로 분할 |
큰 Class | 한 Class에 너무 많은 member(속성) 과 Method 가 존재 | 큰 Class를 신규 Class로 분할 |
너무 많은 파라미터 (Parameter/인수) |
method의 파라미터 개수가 너무 많음 | 파라미터 갯수 줄임 |
두 가지 이상의 이유로 수정되는 클래스 (Divergent Class) |
한 Class 의 Method가 2가지 이상의 이유로 수정되면, 그 Class 는 한가지 종류의 책임만을 수행하는 것이 아님 |
한 가지 이유만으로 수정되도록 변경 (단일 책임) |
여러 클래스를 통시에 수정 (Shotgun Surgery) |
특정 Class를 수정하면 그때마다 관련 된 여러 Class들 내에서 변경이 필요 |
여러 Class 에 흩어진 유사한 기 능을 한곳에 모음 |
다른 Class 를 지나치 게 애용 (Feature Envy) |
번번히 다른 Class 로부터 데이터를 얻어와서 기능을 수행 |
메소드를 그들이 애용하는 데이터| 가 있는 클래스로 옮김 |
유사 데이터들의 그룹 중복(Data Clumps) |
3개 이상의 데이터 항목이 여러 곳에 중복되어 나타남 |
해당 데이터들을 독립된 클래스로 정의 |
리펙토링(Refactoring) 주요 기법
기법 | 설명 |
Extract Method | 그룹으로 함께 묶을 수 있는 코드 조각이 있으면 코드의 목적이 잘 드러나도록 메 소드의 이름을 지어 별도의 메소드로 추출 |
Move Method | 메소드가 자신이 정의된 클래스보다 다른 클래스의 기능을 더 많이 사용하고 있 다면, 이 메소드를 가장 많이 사용하고 있는 클래스에 비슷한 몸체를 가진 새로운 메소드 생성 |
Rename Method | 메소드의 이름이 그 목적을 드러내지 못하고 있다면 메소드의 이름 변경 |
Inline Method | 메소드 몸체가 메소드의 이름 만큼이나 명확할 때는 호출하는 곳에 메소드의 몸 체를 넣고 메소드를 삭제 |
Extract Class | 두 개의 클래스가 해야 할 일을 하나의 클래스가 하고 있는 경우 새로운 클래스를 만들어 관련 있는 필드와 메소드를 기존 클래스에서 새로운 클래스로 이동 |
Replace Temp With Query |
수식의 결과값을 저장하기 위해서 임시 변수를 사용하고 있다면, 수식을 추출해 서 메소드를 만들고, 임시 변수를 참조하는 곳을 찾아 모두 메소드 호출로 교체 |
Substitute Algorithm | 알고리즘을 보다 명확한 것으로 바꾸고 싶은 경우, 메소드의 몸체를 새로운 알고 리즘으로 교체 |
'소프트웨어공학' 카테고리의 다른 글
소프트웨어 개발 방법론 (1/3) (0) | 2019.10.22 |
---|---|
소프트웨어 안전성 분석 기법 - FTA , FMEA, HAZOP (0) | 2019.10.20 |
클라우드 서비스 PaaS(Platform as a Service) 기반의 소프트웨어 개발 방법론 (0) | 2019.10.14 |
EVM (Earned Value Management) : 획득가치관리 (0) | 2019.10.08 |
EVM 과 Burn Down Chart 비교 (0) | 2019.10.07 |