Refectoring 이란?
- 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법
- 버그가 끼어들 가능성을 최소화하면서 코드를 정리하는 "정형화된 방법"
- 코드를 작성한 후에 코드의 디자인을 개선하는 것
Refectoring 에서 요구하는 코드 = 깔끔한 코드
- 깔끔한 코드는 모든 테스트를 통과한다.
- 깔끔한 코드는 다른 프로그래머에게도 그 의미가 명백하다
- 깔끔한 코드에는 중복이 존재하지 않는다.
- 깔끔한 코드는 최소한의 클래스, 즉 꼭 픽요한 클래스만을 가진다.
- 깔끔한 코드는 더 적은 비용으로 , 더 쉽게 유지보수 할 수 있다.
Bad smells in Code
Refectoring의 깔끔한 코드에 속하지 않는 고쳐야 할 코드
Bad smell code | |
중복된 코드 | 코드가 여기저기 겹쳐 있는 경우 |
긴 메소드 | 메소드가 너무 긴 경우 |
거대한 클래스 | 클래스의 파일이나 메소드가 너무 많은 경우 |
너무 많은 인수 | 메소드에 전달되는 인수의 수가 너무 많은 경우 |
변경의 발산 | 사양 변경이 발생한 경우 수정할 곳이 여기저기 흩어진 경우 |
변경의 분산 | 어떤 클래스를 수정하면 다른 클래스에도 영향이 가는 경우 |
속성의 부적절 관계 | 언제나 다른 클래스의 속성을 건드리고 있는 경우 |
데이터 덩어리 | 정리해서 다룰 수 밖에 없는 여러 개의 데이터가 하나의 클래스에 정의되지 않음 |
기본 데이터형 집착 | 새로운 클래스가 아닌 기본 데이터 형만을 사용하는 경우 ( int, String .. ) |
Switch 문 | switch문이나 if문을 사용하여 동작을 분할하는 경우 |
평행 상속 구조 | 서브클래스를 만들면 클래스 계층에 따로 서브 클래스를 만들어야 하는 경우 |
추측성 일반화 | 언제나 이렇게 확장하겠지라고 기대하는 지나친 일반화적인 사고 |
일시적 속성 | 일시적으로 사용할 필드가 있는 경우 |
메시지의 연쇄 | 메소드가 호출하는 연쇄가 너무 많은 경우 |
중개자 | 관리를 위힘하고 자신이 하는 일이 없는 클래스 |
부적절한 관계 | 필요 없는 쌍방향 링크가 열려 있거나 IS-A 관계가 아니면서 상속을 가지는 경우 |
인터페이스 불일치 | 클래스의 API가 부적절한 경우 |
데이터 클래스 | 필드와 get/setter 메소드만 가지는 클래스가 존재하는 경우 |
상속 거부 | 상속하고 있는 메서드면서 그것을 호출하면 문제가 발생하는 경우 |
코멘트 | 코드의 부족을 보충하기 위한 상세한 코멘트가 있는 경우 |
Refactoring 기법
Refactoring은 각 Bad-smells를 해결하기 위해 정형화된 기법들을 정의하고 있다.
메서드 정리
- 메서드 추출 ( Extract Method )
- 메서드 내용 직접 삽입 ( Inline Method )
- 임시변수 내용 직접 삽입 ( Inline Temp )
- 임시변수 메서드 호출로 전환 ( Repalce temp with Query )
- 직관적 임시변수 사용 ( Introduce Explaning Variable )
- 임시변수 분리 ( Spilt Temporary Variable)
- 메개변수로의 값 대입 제거
- 메서드를 메서드 객체로 전환
- 알고리즘 전환
객체 간의 기능 이동
- 메서드 이동 ( Move Method )
- 필드 이동 ( Move Field )
- 클래스 추출 ( Extract Class )
- 클래스 내용 직접 삽입 ( Inline Class )
- 대리 객체 은폐 ( Hide Delegate )
- 과잉 중개 메서드 제거 ( Remove Middle Man )
- 외래 클래스에 메서드 추가 ( Introduce Foreign Method )
- 국소적 상속확장 클래스 사용 ( Introduce Local Extension )
데이터 체계화
- 필드 자체 캡슐화
- 데이터 값을 객체로 변환
- 값을 참조로 변환
- 참조를 값으로 전환
- 배열을 객체로 전환
- 관측 데이터 복재
- 클래스 단방향을 양방향으로, 양방향을 단방향으로 전환
- 마법 숫자를 기호 상수로 전환
- 필드, 컬랙션 캡슐화
- 분류 뷰호를 전환
- 하위클래스를 필드로 전환
조건문 간결화
- 조건문 쪼개기
- 중복 조건식 통합
- 조건문의 공통 실행 코드 빼내기
- 제어 플래그 제거
- 여러 겹의 조건문을 감시 절로 전환
- 조건문을 재정의로 전환
- Null 검사를 널 객체에 위임
- 어설션 넣기
일반화 처리
- 필드 , 메서드 생성자 내용 상향
- 메서드 , 필드 하향
- 하위클래스 , 상위클래스, 인터페이스 추출
- 계층 병합
- 템플릿 메서드 형성
- 상속을 위임으로 전환, 위임을 상속으로 전환
복합 리펙토링
- 상속 구조 정리
- 절차코드를 객체로 전환
- 도메인 로직을 표현과 분리
- 계층구조 추출
반응형
'Tech Stack' 카테고리의 다른 글
Refactoring - 메서드 정리 (1) | 2021.09.16 |
---|