함수 추출하기 ↔ 함수 인라인하기
추출할 때
- 함수 하나가 한 화면을 넘어가지 않게 하기
- 재사용성이 높은 경우
- 목적과 구현을 분리하는 목적
→ 코드를 보고 무슨일을 하는지 파악하기 어렵다면 함수로 추출하라. 이름을 잘 지어야한다.
- 들어갈 코드가 짧아도 목적성을 강조할 수 있다면 추출하라
→ 현재는 함수호출에 걸리는 시간이 매우 짧고, 함수가 짧으면 캐싱이 쉽기 때문에 컴파일러가 최적화하는 데 유리할 수 있다.
인라인할 때
- 함수 본문이 이름만큼 명확할 때
- 간접 호출을 과하게 쓰는것을 방지
변수 추출하기 ↔ 변수 인라인하기
추출할 때
- 표현식이 너무 복잡할 때
- 디버깅에 도움
→ 디버거에 중단점을 지정하거나 지역변수에 저장한 상태값을 출력하게 할 수 있음
- 특정 함수 안에서만 의미가 있다면 변수로 추출
→ 함수를 벗어난 넓은 문맥에서 의미가 있다면 함수로 추출하자.
인라인할 때
- 표현식이 이름만큼 명확할 때
- 변수가 주변코드를 리팩터링하는데 방해되는 경우
함수 선언 바꾸기
- 함수 이름을 명확하게 변경
- 매개변수 적절하게 추가/제거하기
변수 캡슐화하기
- 접근 범위가 넓은 가변 데이터를 변경 및 사용할 때에는 getter / setter 사용
- 필드를 private으로 유지하기 위함
- 게터가 데이터의 복제본을 반환하도록 처리하면 원본에 영향을 주지않음
→ Object.assign({}, data)
변수 이름 바꾸기
매개변수 객체 만들기
- 자주 함께 몰려다니는 매개변수들은 하나의 객체로 모으기
- 매개변수의 수가 줄어들고 데이터 사이의 관계가 명확해짐
- 데이터 구조를 활용하는 형태로 프로그램 동작을 재구성하여 코드를 근본적으로 바꿔줌
여러 함수를 클래스로 묶기
- 공통 데이터를 중심으로 긴밀하게 엮여 작동하는 함수들의 경우 클래스 하나로 묶는것이 좋음.
- 중첩함수 형태로 묶는 것 보다는 클래스로 묶는 것이 테스트에 용이하고 원본 데이터가 코드 안에서 갱신될 때 일관성을 유지하기 좋음
여러 함수를 변환 함수로 묶기
- 도출로직을 한데 모아 일관된 장소에서 처리할 수 있음
- 도출 로직이 중복되는것을 피할 수 있음
단계 쪼개기
- 서로 다른 두 대상을 한꺼번에 다루는 코드를 발견한다면 별개의 모듈로 나눔
- 모듈이 잘 분리되어있으면 다른 모듈의 상세내용을 몰라도 모듈 단위로 수정을 마칠 수 있음
-> 각 단계에서 자신만의 문제에 집중하는 컴파일러의 동작 방식(토큰화 - 파싱 - 최적화 - 코드생성)과 유사