본문 바로가기
Tech Stack

Refectoring

by jaeaemin 2021. 9. 15.
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