리팩터링 2판
2022/06/20 ~ 2022/07/15
- 리팩터링 하기 전과 후의 코드가 똑같이 동작해야 한다.
- 리팩터링 과정에서 발견된 버그는 리팩터링 후에도 그대로 남아있어야 한다.
- 수정하는 과정에서 사이드 이펙트가 발생할 지 모른다
- 리팩터링의 목적은 코드를 이해하고 수정하기 쉽게 만드는 것이다.
- 궁극적 목표는 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것이다.
- 코드의 구조부터 잡아라
- 기존 코드는 잘 동작한다는 확신을 준다.
- 리팩터링을 하지 않더라도 좋은 테스트를 작성하는 일은 개발 효율을 높여준다.
- 실패해야할 상황에는 실패하게 만들자.
- 어차피 모든 버그를 잡아낼 수는 없다고 생각하여 테스트를 작성하지 않는다면 대다수의 버그를 잡을 수 있는 기회를 날리는 셈이다.
테스트 코드를 짜고 리팩토링하는 것은 시간낭비라고 할 수 있지만 초반에 만들어두면 디버깅 시간이 줄어 전체적인 작업시간과 효율은 오히려 긍정적인 영향을 준다.
- 조금씩 변경하고 매번 테스트를 해야 어느 부분에서 문제가 발생했는지 파악할 수 있다,
- 컴파일 → 테스트 → 커밋
- let보단 const 사용하기
- 변수명으로 나타내는 것이 이해하기 쉽다면 변수로 만들어줘라.
- 특히, 3.14 같은 상수는 변수로 만들어서 목적을 명확히 드러내야 한다.
- 함수의 반환값의 변수명은 항상 result를 사용해라
- 불변성을 위해서 원본 data를 훼손하지 말고 만들어서 반환하기
- side effect도 억제할 수 있다.
- if 문 대신 삼항 연산자 사용하기
- if문의 내용이 1줄이어도 { }를 통해서 나타내자. 중첩된 if문이라면 가독성이 매우 떨어지기 때문이다.
- 중첩 조건문은 보기도 어렵고 더러워지고 유지보수하기도 어렵다
- 함수가 빨리 종료될 수 있도록 if-else로 나누는 게 아닌 쉽게 결과가 도출될 수 있는 부분을 앞에 배치한다.
- 배열의 내장 메소드 활용하기
- 공통된 로직은 함수로 뽑아내고 살짝 다른 부분은 매개변수로 전달해라(함수여도 OK)!
- 클래스를 사용하면 많은 악취들을 잡을 수 있다.
- 최대한 private로 만들어 get만 제공하고 set은 필요한 경우에만 만들어주기
- 관련 프로퍼티의 동작들을 클래스에서 관리할 수 있어서 명확하게 무슨일을 하는지 파악하기 좋다.
- 팩토리 함수를 만들어 제공하는 것도 좋다.
- 상속을 통해 다형성 구현
- 공통된 프로퍼티는 슈퍼 클래스에 둬라.
- 컴포지션을 사용해라
- 최대한 쪼개기
- 예외는 정확히 예상 밖의 동작일 때만 쓰여야 한다.
- 처리할 수 있는 예외는 처리해라
- 변수로 만들 필요가 없다면 인라인하기
- 응집도 UP, 결합도 Down 해야한다
- 지역 변수를 제거해라
- 추출 작업이 쉬워진다.
- 같이 사용하는 것들은 한곳에 같이 둬라
- 반복문을 쪼개서 성능이 느려질까 걱정하지마라
- 똑똑한 컴파일러들이 최신 캐싱기법을 통해 관리해준다.
- 단계를 잘게 나눠야 더 빠르게 처리할 수 있다,
조건식 통합하기
- 10-2.js
중첩 조건문을 보호 구문으로 바꾸기
- 10-3-1.js
- 10-3-2.js
플래그 인수 제거하기 : 그냥 2개로 만들어라!
- 11-3.js
타입 코드를 서브 클래스로 바꾸기
- 12-6.js