/refactoring-2

리팩터링 2판 공부!

Primary LanguageJavaScript

refactoring-2

리팩터링 2판

2022/06/20 ~ 2022/07/15

리팩터링

  • 리팩터링 하기 전과 후의 코드가 똑같이 동작해야 한다.
  • 리팩터링 과정에서 발견된 버그는 리팩터링 후에도 그대로 남아있어야 한다.
    • 수정하는 과정에서 사이드 이펙트가 발생할 지 모른다
  • 리팩터링의 목적은 코드를 이해하고 수정하기 쉽게 만드는 것이다.
  • 궁극적 목표는 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것이다.
  • 코드의 구조부터 잡아라

테스트의 중요성

  • 기존 코드는 잘 동작한다는 확신을 준다.
  • 리팩터링을 하지 않더라도 좋은 테스트를 작성하는 일은 개발 효율을 높여준다.
  • 실패해야할 상황에는 실패하게 만들자.
  • 어차피 모든 버그를 잡아낼 수는 없다고 생각하여 테스트를 작성하지 않는다면 대다수의 버그를 잡을 수 있는 기회를 날리는 셈이다.

오해

테스트 코드를 짜고 리팩토링하는 것은 시간낭비라고 할 수 있지만 초반에 만들어두면 디버깅 시간이 줄어 전체적인 작업시간과 효율은 오히려 긍정적인 영향을 준다.

주의

  • 조금씩 변경하고 매번 테스트를 해야 어느 부분에서 문제가 발생했는지 파악할 수 있다,
    • 컴파일 → 테스트 → 커밋

Keyword

  • 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