728x90
반응형
SMALL

소프트웨어를 개발하는 프로그래머라면 누구나 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 개념



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 알고리즘을 보다 명확한 것으로 바꾸고 싶은 경우, 메소드의 몸체를 새로운 알고
리즘으로 교체

 

728x90
반응형
LIST

+ Recent posts