Refactoring

[ 리팩토링 by 마틴 파울러 ] Chapter08. 기능 이동

noahkim_ 2021. 7. 22. 01:51

지금까지는 프로그램 요소를 생성 혹은 제거하거나 이름을 변경하는 리팩터링을 다뤘다. 여기에 더해 요소를 다른 컨텍스트(클래스나 모듈 등)로 옮기는 일 역시 리팩토링의 중요한 축이다. 

 

8.1 함수 옮기기

 

함수가 자신이 속한 모듈 A보다 다른 모듈 B를 더 많이 참조한다면

모듈성을 높이기 위해 서로 연관된 요소들을 함께 묶고, 요소 사이의 연결 관계를 쉽게 찾고
이해할 수 있도록 해야 함.

 

함수를 옮길 시에 대상 함수의 현재 컨텍스트와 후보 컨텍스트를 둘러보면 도움이된다.

 

8.2 필드 옮기기

 

데이터 구조가 적절치 않음을 깨달으면 곧바로 수정하기

(어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 함께 넘기고 있다면 데이터 위치를 옮겨야 할 것)

 

필드 캡슐화 => 필드값을 외부에서 변경하지 못하게 할 시 사용

 

  • 날 레코드

C언어의 구조체처럼 데이터를 외부로 직접 노출하는 레코드

접근자 만들고 날 레코드 접근하는 모든 함수가 접근자를 거치도록

 

  1. 공유 객체로 이동

accountType에 따라 account의 이자율이 결정되지 않으면 

기존 겉보기 동작이 달라져버리는 변화가 존재한다. 

=> assertion을 적용한 채 시스템을 돌려 확인해야 한다.

 

8.3 문장을 함수로 옮기기

 

‘중복 제거’

함수로 되있지 않은 구문을 함수로 옮기기 (중복제거의 목적이 강하다)

(함수추출하기와 유사)(그러나 함수 추출하기는 구현과 목적의 구분을 위해 함수를 생성하였던 것)

 

문장들이 피호출 함수의 일부라는 확신이 필요하다

문장과 피호출 함수를 통째로 하나의 함수로 추출하기도 가능

 

8.4 문장을 호출한 곳으로 옮기기

 

여러 곳에서 사용하던 기능이 일부 호출자에게는 다르게 동작하도록 바뀌어야 할 때 

함수 밖으로 빼버려 사용하는 경우

 

8.5 인라인 코드를 함수 호출로 바꾸기

 

함수 추출하기와 비슷

(대체함수가 존재하는지의 여부가 없으면 함수로 만들어줘라)

(대체여부가 있다면 그 함수를 리팩토링해서 사용하기)

 

, 우연히 기존의 함수와 비슷한 코드로 쓰여질때는 대체여부가 있다 생각하면 안됨.

 

8.6 문장 슬라이드하기

 

관련된 코드 가까이 모아 이해를 쉽게

 

  • 부수효과

코드줄을 옮겼을 때 코드가 깨질 수 있음 (계산식의로직을 건드릴 경우)

 

구현된 코드의 로직을 건드려 기능중인 코드가 망가지는 결과가 생길 수 있음.

 

코드 리팩토링 시 연산이 무엇이고 어떻게 구성되는지 완벽히 이해해야 함

명령-질의 분리 원칙을 지켜 부수효과 없도록 하기

 

  • 함수는 동작을 수행하는 명령 / 답을 구하는 질의 두가지 성격으로 분류되어야 한다

    Input / output

 

8.7 반복문 쪼개기

 

하나의 반복문에서 행해지는 두 일을 두개의 반복문으로 쪼개기

 

같이 있으면, 수정할 때마다 두 개 다 잘 이해해야 하므로 두개로 나누면 사용하기도 쉬워짐

또한 의존성이 사라져 기능구현에 집중가능

 

두개로 나누면 느려질 있다. 그러나 함수 추출시 의미가 있음

 

8.8 반복문을 파이프라인으로 바꾸기

 

Collection Pipeline 

 

  • slice() : 추출시작점부터 종료 인덱스까지 슬라이싱하여 새로운 배열 반환
  • map() : 여러 줄짜리 데이터를 문자열 배열로 변환함

 

8.9 죽은 코드 제거하기

 

더이상 사용하지 않은 코드는 지워라

git으로 살리면 그만