ch01. 리팩터링 : 첫 번째 예시
1.0 리팩터링이란?
- 겉으로 드러나는 코드의 기능은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정
- 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 것
1.2 예시 프로그램을 본 소감
✔️ 프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링하고 나서 원하는 기능을 추가하면 된다.
1.3 리팩터링의 첫 단계
✔️ 리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.
-
리팩터링할 코드 영역을 꼼꼼하게 검사해줄 테스트 코드를 마련해야 한다.
-
테스트의 성공/실패를 스스로 판단하는 자가진단 테스트를 만드는 것이 필요하다.
1.4 statement() 함수 쪼개기
✔️ 리팩터링은 프로그램 수정을 작은 단계로 나눠 진행한다. 그래서 중간에 실수하더라도 버그를 쉽게 찾을 수 있다
- 어떤 코드를 볼 때, 분석해서 정보를 얻어야 한다면 그 코드는 명확성이 떨어지는 것이므로 코드가 하는 일이 명확해지도록 리팩터링이 필요하다.
- 별도 함수로 빼냈을 때 유효범위를 벗어나는 변수, 즉 새 함수에서는 곧바로 사용할 수 없는 변수가 있는 지 확인한다.
- 값이 바뀌지 않는 변수는 매개변수로 전달하고, 함수 안에서 값이 바뀌는 변수는 함수는 추출한 함수 안에서 선언한다.
- 아무리 간단한 수정이라도 리팩터링 후에는 항상 테스트하는 습관을 들이는 것이 바람직하다.
✔️ 컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다.
지역 변수 제거
- 지역 변수를 제거해서 얻는 가장 큰 장점은 추출 작업이 훨씬 쉬워진다는 것이다. 유효범위를 신경 써야 할 대상이 줄어들기 때문이다.
변수 작명
- 함수의 값에는
result
라는 변수명을 사용한다. - 매개변수의 역할이 뚜렷하지 않을 때는 부정 관사(a/an)을 붙인다.
함수 작명
- 함수의 핵심을 고려하여 함수명을 지어야 한다.
- 금액을 US dollar로 변환해주는 함수는
format
보다는usd
가 더 함수의 역할을 잘 표현한다. - 작명시, 처음에는 당장 떠오르는 최선의 이름을 사용하다가 나중에 더 좋은 이름이 떠오를 때 바꾸는 식이 좋다.
반복문 쪼개기
- 변수 값을 누적시키는 부분을 분리한다.
문장 슬라이드 하기
- 변수 초기화 문장을 변수 값 누적 코드 바로 앞으로 옮긴다.
리팩터링으로 인한 성능 저하?
- 리팩터링 때문에 성능이 떨어진다면, 하던 리팩토링을 마무리하고 나서 성능을 개선하자.
1.6 계산 단계와 포맷팅 단계 분리하기
하나의 로직을 데이터를 처리하는 로직과 처리한 데이터를 HTML로 표현하는 로직으로 분리한다.
객체 얕은 복사
가변 mutable 데이터
는 금방 상하기 때문에, 데이터를 최대한불변 immutable
취급하는 것이 좋다.- 함수에서 매개변수로 받은 객체를 그대로 사용하지 않고,
얕은 복사
를 수행해 사용한다.
function enrichPerformance(aPerformance) {
const result = Object.assign({}, aPerformance); // 얕은 복사 수행
return result;
}
1.7 중간 점검 : 두 파일(과 두 단계)로 분리됨
✔️ 프로그래밍에서 만큼은 명료함이 진화할 수 있는 소프트웨어의 정수다
✔️ 캠핑자들에게는 “도착했을 때 보다 깔끔하게 정돈하고 떠난다”는 규칙이 있다. 프로그래밍도 마찬가지다. 항시 코드베이스를 작업 시작 전보다 건강하게(healthy) 만들어놓고 떠나야 한다.
1.8 다형성을 활용해 계산 코드 재구성하기
ECMAScript 2015 버전(ES6)
부터 객체지향을 사용할 수 있는 문법과 구조가 제대로 지원되기 시작했다.- 조건부 로직을 명확한 구조로 보완하는 방법은 다양하지만, 예시코드에서는 객체지향의 핵심 특성인
다형성 polymorism
을 활용하는 것이 자연스럽다.
조건부 로직을 다형성으로 바꾸기
- 조건부 코드 한 덩어리를 다형성을 활용하는 방식으로 바꿔준다.
- 상속 계층을 구성해서 희극 서브클래스와 비극 서브클래스가 각자의 구체적인 계산 로직을 정의하는 것이다.
1.10 마치며
- 프로그래밍 팀의 현재와 이상의 차이에 항상 신경 쓰면서, 이상에 가까워지도록 리팩터링해야 한다.
✔️ 좋은 코드를 가늠하는 확실한 방법은 ‘얼마나 수정하기 쉬운가’다.
1장에서 진행한 리팩토링의 단계
- 원본 함수를 중첩 함수 여러 개로 분리
- 단계 쪼개기를 적용해 데이터를 다루는 로직과 출력하는 로직을 분리
- 데이터 로직을 다형성으로 표현
코드를 건강하게 관리하자
- 건강한 코드베이스는 생산성을 극대화하고, 고객에게 필요한 기능을 더 빠르고 저렴한 비용으로 제공하도록 해준다.
리팩터링의 핵심
- 단계를 잘게 나눠야 더 빠르게 처리할 수 있고, 코드는 절대 깨지지 않으며, 이러한 작은 단계들이 모여서 상당히 큰 변화를 이룰 수 있다는 사실을 깨닫는 것
Source
- 리팩터링 2판 (마틴 파울러 저)