11.API 리팩터링
11.1 질의 함수와 변경 함수 분리하기
겉보기에 부수효과 없이 값을 반환해주는 함수를 추구해야함 -> 질의함수 (읽기함수, 연산을 통해 값을 계산하여 반환하는 함수)는 모두 부수효과가 없어야함
값을 반환하면서 부수 효과도 있다면 분리 하는게 좋음
절차
- 대상 함수를 복제하고 질의 목적에 충실한 이름을 짓기
- 새 질의 함수에서 부수효과를 모두 제거하기
- 정적 검사
- 원래 함수를 호출하는 곳을 모두 찾기. 호출하는 곳에서 질의 함수를 호출하도록 변경하고, 원래 함수 호출을 아래 줄에 추가하기. 하나 바꾸고 테스트
- 원래 함수에서 질의 관련 코드 제거
- 테스트
11.2 함수 매개변수화 하기
- 두 함수 로직이 비슷하고 리터럴 값만 다르다면, 그 값만 매개변수로 받고 함수 합치기
절차
- 비슷한 함수 중 하나를 선택하기
- 함수 선언 바꾸기로 리터럴들을 매개변수로 추가하기
- 함수 호출하는 곳에 적절한 리터럴 값을 추가하기
- 테스트
- 매개변수로 받은 값을 사용하도록 함수 본문 수정하기. 수정마다 테스트
- 비슷한 다른 함수를 호출하는 코드를 찾아 매개변수화 된 함수를 호출하도록 하나씩 수정하기. 수정마다 테스트
11.3 플래그 인수 제거하기
절차
- 매개변수로 주어질 수 있는 값 각각에 대응하는 명시적 함수를 생성하기
- 원래 함수를 호출하는 코드들을 찾아 각 리터럴에 대응되는 명시적 함수를 호출하도록 수정하기
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 질의 함수를 매개변수로 바꾸기
절차
- 변수 추출하기로 질의코드를 함수 본문 나머지 코드와 분리
- 함수 본문 중 해당 질의를 호출하지 않는 코드들을 별도 함수로 추출
- 방금 만든 변수를 인라인해 제거
- 원래 함수도 인라인
- 새 함수의 이름을 원래 함수 이름으로 고치기
11.7 세터 제거하기
- 객체가 생성된 후 값이 변경 되면 안 될 때
- 세터를 제거하고 생성자로 대체
11.8 생성자를 팩터리 함수로 바꾸기
- 팩터리 함수 : 생성자 역할을 대신해주는 함수
- 생성자에는 일반함수에 없는 제약이 붙기도 해서 이러한 방법을 씀
절차
- 팩터리 함수 만들기. 팩터리 함수에서는 원래 생성자 호출
- 생성자 호출하던 코드를 팩터리 함수 호출로 변경
- 하나 수정 마다 테스트
- 생상자의 가시 범위가 최소가 되도록 제한하기
11.9 함수를 명령으로 바꾸기
11.10 명령을 함수로 바꾸기
11.11 수정된 값 반환하기
절차
- 함수가 수정된 값을 반환하게하여 호출자가 그 값을 자신의 변수에 저장
- 테스트
- 피호출 함수 안에 반환할 값을 가리키는 새로운 변수를 선언하기
- 테스트
- 계산이 선언과 동시에 이뤄지도록 통합하기
- 테스트
- 피호출함수의 변수 이름을 역할에 맡게 수정하기
- 테스트
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 |