Refactoring

[리팩토링 2판] 11장

ㅋ. ㅋ 2024. 3. 1. 15:02

11.API 리팩터링

11.1 질의 함수와 변경 함수 분리하기

  • 겉보기에 부수효과 없이 값을 반환해주는 함수를 추구해야함 -> 질의함수 (읽기함수, 연산을 통해 값을 계산하여 반환하는 함수)는 모두 부수효과가 없어야함

  • 값을 반환하면서 부수 효과도 있다면 분리 하는게 좋음

절차

  1. 대상 함수를 복제하고 질의 목적에 충실한 이름을 짓기
  2. 새 질의 함수에서 부수효과를 모두 제거하기
  3. 정적 검사
  4. 원래 함수를 호출하는 곳을 모두 찾기. 호출하는 곳에서 질의 함수를 호출하도록 변경하고, 원래 함수 호출을 아래 줄에 추가하기. 하나 바꾸고 테스트
  5. 원래 함수에서 질의 관련 코드 제거
  6. 테스트

11.2 함수 매개변수화 하기

  • 두 함수 로직이 비슷하고 리터럴 값만 다르다면, 그 값만 매개변수로 받고 함수 합치기

절차

  1. 비슷한 함수 중 하나를 선택하기
  2. 함수 선언 바꾸기로 리터럴들을 매개변수로 추가하기
  3. 함수 호출하는 곳에 적절한 리터럴 값을 추가하기
  4. 테스트
  5. 매개변수로 받은 값을 사용하도록 함수 본문 수정하기. 수정마다 테스트
  6. 비슷한 다른 함수를 호출하는 코드를 찾아 매개변수화 된 함수를 호출하도록 하나씩 수정하기. 수정마다 테스트

11.3 플래그 인수 제거하기

절차

  1. 매개변수로 주어질 수 있는 값 각각에 대응하는 명시적 함수를 생성하기
  2. 원래 함수를 호출하는 코드들을 찾아 각 리터럴에 대응되는 명시적 함수를 호출하도록 수정하기
 onSelectAll(isSelect: boolean, rows: any) {
      if (isSelect) {
        setCheckedRowsFilter({ selected: rows.map((row: { resourceId: string }) => row.resourceId) });
        setCheckedRows({ selected: data });
      } else {
        setCheckedRowsFilter({ selected: [] });
        setCheckedRows({ selected: [] });
      }
 }
 // 이런 경우....... 저 ??????????

11.4 객체 통쨰로 넘기기

  • 레코드를 통째로 넘기면, 매개변수 목록 수정할 일이 줄어듦

  • 함수가 레코드 자체에 의존하기 원치 않을 시 해당 리팩터링 수행 x

11.5 매개변수를 질의 함수로 바꾸기

const getPrice = () => {
  const price = quantity * itemPrice;
  const level = quantity > 10 ? 2 : 1;
  return discount(price, level);
};

const discount = (price, level) => {
  switch (level) {
    case 1:
      return price * 0.95;
    case 2:
      return price * 0.9;
  }
};
// 이 함수가 생김으로써 discount에 level 매개변수를 전달하지 않아도 됨
const getLevel = () => {
  return quantity > 10 ? 2 : 1;
};

const getPrice = () => {
  const price = quantity * itemPrice;
  return discount(price); //
};

const discount = (price) => {
  switch (getLevel()) {
    case 1:
      return price * 0.95;
    case 2:
      return price * 0.9;
  }
};

11.6 질의 함수를 매개변수로 바꾸기

절차

  1. 변수 추출하기로 질의코드를 함수 본문 나머지 코드와 분리
  2. 함수 본문 중 해당 질의를 호출하지 않는 코드들을 별도 함수로 추출
  3. 방금 만든 변수를 인라인해 제거
  4. 원래 함수도 인라인
  5. 새 함수의 이름을 원래 함수 이름으로 고치기

11.7 세터 제거하기

  • 객체가 생성된 후 값이 변경 되면 안 될 때
  • 세터를 제거하고 생성자로 대체

11.8 생성자를 팩터리 함수로 바꾸기

  • 팩터리 함수 : 생성자 역할을 대신해주는 함수
  • 생성자에는 일반함수에 없는 제약이 붙기도 해서 이러한 방법을 씀

절차

  1. 팩터리 함수 만들기. 팩터리 함수에서는 원래 생성자 호출
  2. 생성자 호출하던 코드를 팩터리 함수 호출로 변경
  3. 하나 수정 마다 테스트
  4. 생상자의 가시 범위가 최소가 되도록 제한하기

11.9 함수를 명령으로 바꾸기

11.10 명령을 함수로 바꾸기

11.11 수정된 값 반환하기

절차

  1. 함수가 수정된 값을 반환하게하여 호출자가 그 값을 자신의 변수에 저장
  2. 테스트
  3. 피호출 함수 안에 반환할 값을 가리키는 새로운 변수를 선언하기
  4. 테스트
  5. 계산이 선언과 동시에 이뤄지도록 통합하기
  6. 테스트
  7. 피호출함수의 변수 이름을 역할에 맡게 수정하기
  8. 테스트
const totalPrice = getTotalPrice(); // <- 이게 1,5 단계?

const getTotalPrice = () => {
  let totalPrice = 0;
  let result = 0; // 위에서 밑으로 변수명 바꾸는게 7 단계
  // 어쩌고 저쩌고 로직
  return result;
};

11.12 오류 코드를 예외로 바꾸기

11.13 예외를 사전확인으로 바꾸기

'Refactoring' 카테고리의 다른 글

[리팩터링 2판] 10장  (1) 2024.02.29
[리팩터링 2판] 8장  (4) 2024.02.28
[리팩터링 2판] 7장  (0) 2024.01.17
[리팩터링 2판] 6장  (0) 2024.01.17
[리팩터링 2판] 3, 4장  (0) 2023.10.04