리팩토링 2판 - 2022.06.08 - 1장. 리팩터링: 첫 번째 예시

moontag·2022년 6월 8일
0

북클럽 TIL

목록 보기
12/12


총 p.550
읽은 범위 : p.78까지


1장. 리팩터링: 첫 번째 예시

📚 오늘 TIL 3줄 요약

  • 각 단계가 끝나면 컴파일-테스트-커밋을 반복해라
  • 조건부로직을 다형성으로 바꾸기
  • 좋은 코드는 수정하기 쉬운 코드다


📚기억하고 싶은 내용

리팩터링 굳이 해야 할까?

코드를 정리한들 새로운 기능이 생기는 것도 아니고 그저 코드가 더 깔끔해 보일 뿐이지 않은가, 굳이 긁어 부스럼 만들지 말라? (잘 돌아가는 코드는 손대는 게 아니다?)
6개월 후 해당 프로젝트는 망했다. 코드가 복잡해서 디버깅도 못하고 최소 성능 요건을 맞추는 것도 불가능해졌다. 거대한 기술부채는 결국 탈이 나기 마련이다.

리팩터링이란?

  • 코딩 후 설계 개선
  • 버그를 최소한으로 줄이면서 코드를 정리하는 것
  • 코드의 기능은 그대로면서 내부 구조를 개선하는 방식

리팩터링의 첫 단계

  • 리팩터링할 코드 영역을 검사해줄 테스트 코드들부터 마련해야한다.
  • 최신 테스트 프레임워크로 자가진단 테스트를 작성해라
  • 테스트 작성시간이 걸리지만, 디버깅시간이 줄어 전체 작업시간은 오히려 단축된다

함수 쪼개기

  • 전체동작에서 부분으로 나눌 수 있는 지점 찾기
  • 해당부분 함수로 추출하기
  • 값이 바뀌지 않는 변수는 매개변수로 전달
  • 값이 바뀌는 변수는 변수 초기화 정의하기
  • 리팩터링은 프로그램 수정을 작은 단계로 나눠 진행한다.

  • 하나의 리팩터링이 문제가 없으면 변경사항을 로컬 버전관리 시스템에 커밋하기
    git, mercurial처럼 개인 커밋 지원하는 시스템 사용하기

  • 컴파일하고 테스트하고 커밋한다

  • 임시 변수를 질의 함수로 바꾸기 (함수로 추출)

  • 변수 인라인하기

    for(let perf of invoice.perfermances){
    const play = playFor(perf); => 인라인된 변수는 제거
    let thisAmount = amountFor(perf, playFor(perf));
    // ~
    }

  • 지역변수부터 제거한다

  • 적합한 이름으로 함수 선언명 수정하기

  • 반복문을 쪼개고, 변수 초기화 문장을 옮기고, 함수 추출한다
    각 단계 끝에선 항상 컴파일-테스트-커밋한다

계산 단계와 포맷팅 단계 분리하기

  • 계산 로직은 여러 개의 보조함수로 빼낸다. (중첩함수 구조로)

  • 리팩토링과정에서 성능이 크게 떨어졌다면, 그 후에 성능 개선 작업이 필요하다. 하지만 리팩터링 덕분에 성능 개선도 효과적으로 개선할 수 있다.

  • 반복문을 파이프라인으로 바꾸기

다형성을 활용해 계산 코드 재구성하기 p.64~

  • 조건부로직을 다형성으로 바꾸기
  • 먼저 상속계층을 정의하기 - class에 로직 담기
  • 함수를 class 안으로 옮기기
  • 타입 코드를 서브 클래스로 바꾸기
  • 생성자를 팩터리함수로 바꾸기

다형성을 활용해 데이터 생성하기


  • 함수 추출하기
  • 변수 인라인하기
  • 함수 옮기기
  • 조건부 로직을 다형성으로 바꾸기
  1. 원본함수를 중첩 함수 여러개로 나누기
  2. 단계 쪼개기
  3. 계산 로직을 다형성으로 표현하기

좋은 코드는 수정하기 쉬운 코드다



🎤소감

1장은 전부 예시로 설명해주기 때문에, 예시를 통해 리팩터링 방법에 대해서 감을 잡아야 하는데
각 단계를 쪼개는 것은 이해가 좀 간다.
하지만, 다형성의 class부분이 아직 감이 잡히지 않았다. 다시 읽어볼 것!!
그리고 코드를 재구성하는 모습에 있어서 내가 실제로 책처럼 능수능란하게 적용을 잘 할 수 있을지에 대한 생각이 들었다. 재구성이 아직 나에겐 좀 어렵게 다가왔다.
또 읽어도 모르는 것들이 나와서 익숙하지 않은 것에 대한 훈련이 필요하다고 느꼈다...



🤷‍♂️ 궁금한 내용, 잘 이해되지 않는 내용은?

  • p.64~ 다형성 활용해 재구성하기 class부분 예시!!!!

  • 팩토리 함수
    : new키워드 없는 객체를 리턴하는 함수

  • 재구성 잘하는 법? 꼬리에 꼬리를 물고 나가는 듯한 느낌?

profile
터벅터벅 나의 개발 일상

0개의 댓글