리팩터링 2판을 회사 팀 내 스터디로써 진행한다. 스터디에선 따로 책 내용을 정리를 하지 않고 주마다 정해진 분량까지 읽고 감상을 나눈다. 여기선 개인적으로 매 분량에 대한 정리와 짧은 감상을 올린다.
6장 이후로 각 기법의 절차, 예시보단 배경 위주로 정리한다.
리팩터링 기법 명칭은 빨간색으로 표시한다.
08 기능 이동
(아래 “8.1 함수 옮기기” 부분에 쓰여 있지만, 함수가 아닌 코드에도 해당하는 내용이다)
모듈성(modularity)을 높여주는 방법 중 하나인 코드에 대한 이해력을 높이기 위해 코드가 적절히 모여, 나뉘어 있어야 한다. 따라서 코드를 옮기기 쉽다 또는 옮길 수 있다(이 장에서 설명할 리팩터링 기법)은 모듈성을 올릴 수 있는 코드이다.
모듈성:
•
작은 부분만 이해해도 프로그램을 수정을 가능케 하는 능력
•
요소 사이의 연결관계가 이해하기 쉬워야 한다.
8.1 함수 옮기기
함수가 위치한 컨텍스트를 옮기는 것을 의미한다.
oop에서 컨텍스트는 클래스이다.
함수에 해당하는 또 하나의 컨텍스트는 중첩함수이다(그것의 상위 함수).
존재하지 않는 컨텍스트(클래스)로 옮기는 것은 클래스로 묶기나 클래스 추출로 할 수 있다.
참조는 매개변수로 넘겨지거나 이동하는 컨텍스트로 함께 옮겨가는 방법이 있다.
매개변수의 경우 넘길 데이터가 많다면 객체로 넘기는 것이 낫다.
8.2 필드 옮기기
데이터 구조가 적절하다면 코드는 자연스럽게 단순하고 직관적으로 쓰인다.
적절한 데이터 구조를 설계하는데엔 경험과 기술(e.g. ddd)이 중요하다.
그럼에도 잘못 설계할 수 있고 이럴 때 코드는 즉시 수정 가능해야 한다.
레코드 수정보다 코드로써 수정하기 위해 레코드 캡슐화 이후에 수정하는 것이 편하다.
8.3 문장을 함수로 옮기기
중복 코드(문장)를 함수로써 제거한다.
8.4 문장을 호출한 곳으로 옮기기
함수에서 변형(분기)이 발생할 때 위 기법의 반대로 문장을 함수 바깥으로 뺀다.
바깥으로 빼기 위해서 우선 이후에 설명할 문장 슬라이드하기를 한다.
8.5 인라인 코드를 함수 호출로 바꾸기
함수 추출하기와 다른 점은 이미 있는 함수 호출로 대체하느냐이다(함수 추출하기는 함수를 새로 만든다).
8.6 문장 슬라이드하기
관련 코드를 줄 단위로 모으는 것이다.
부수효과가 없는 코드는 슬라이드가 가능하다.
•
(리팩터링으로 인한 겉보기 동작이 바뀌지 않는다는) 확신이 없을 땐 슬라이드의 크기를 줄여가며 옮겨본다.
문장 교환하기 Industrial Logic - Better Software SoonerThe Swap Statement Refactoring 는 더 좁은 의미의 문장 슬라이드하기이다.
8.7 반복문 쪼개기
반복문을 쪼개면 성능이 떨어질 수는 있다.
•
리팩터링은 성능 최적화가 아니다.
•
반복문 쪼개기로 인한 성능 저하는 big o 표기에서 상수의 변화(증가)이기 때문에 크게 영향이 없을 것이라 기대한다.
서로 다른 일이 한 함수(반복문)에서 하고 있을 때 필요하다.
8.8 반복문을 파이프라인으로 바꾸기
8.9 죽은 코드 제거하기
느낀점
•
•
수정을 쉽게하는 것의 핵심; 데이터를 코드로써 사용하는 것
•
두 가지 명명법에 대한 생각
◦
변수를 데이터?로써의 명명법(aNumber, loopItems , …)
▪
동작(데이터라면 타입?)이 아닌 목적을 명명하는 함수의 작명법과 크게 다르지 않은가
▪
두번째 것은 loop 만 빼면 익숙하긴 하다. 그럼 number 도? (키워드라 쓰지 않는다)
◦
임시 이름 막 짓기 (zznew, zztmp)
▪
신기하다. 대단하다. 하지만 실용적일까?
▪
(막연하게) 정말 큰 코드베이스에선 그럴 것이라 기대한다.
•
교환이 어떻게 슬라이드의 부분집합인지 모르겠다.
•
슬라이드 크기를 줄이는 것이 어떻게 도움이 될지(실패 위험을 줄이는지 또는 적게 하더라도 효과가 있는지) 모르겠다.
•
루비에서 느낌표를 붙인 메소드 이름은 부수효과가 있음을(명령 함수, modifiers, mutators) 나타내는 명명 컨벤션이다 Bang Methods | Ruby for Beginners
•
반복문 쪼개기는 반복문을 파이프라인으로 바꾸기로 가는 단계로 보인다.
•
파이프라인 인자 괄호 정렬은 아주 좋아 보인다.