개요
겉보기 부수효과가 전혀 없는 함수를 추구해야 한다. 이런 함수는 옮기기도 쉽고, 아무 시점에 호출해도 항상 같은 값을 리턴한다.
부수효과가 있는 함수와 없는 함수는 구분해야 한다.
질의함수는 모두 부수효과가 없어야 한다. 이 규칙을 명령/질의 분리라 한다.
겉보기 부수효과란, 부수효과가 전혀 없는 함수와 똑같은 결과를 리턴하지만, 실제론 상태를 변경하는 것을 의미한다. 예를들어 캐싱 기능을 지원하면, 분명 호출로 상태가 변경된다. 하지만 같은 결과를 리턴하는 사실은 똑같다.
예시
악당을 찾는 함수
function alertForMiscreant(people){ for(const p of people){ if(p==="조커"){ setOffAlarms(); return "조커"; } if(p==="사루만"){ setOffAlarms(); return "사루만"; } } return ""; } |
//함수 복제 후 질의 목적에 맞는 이름 짓기 function findMiscreant(people){ for(const p of people){ if(p==="조커"){ setOffAlarms(); return "조커"; } if(p==="사루만"){ setOffAlarms(); return "사루만"; } } return ""; } |
//부수효과 제거 function findMiscreant(people){ for(const p of people){ if(p==="조커") return "조커"; if(p==="사루만") return "사루만"; } return ""; } |
//원래 함수 호출하던 곳, 새로 만든 질의함수로 바꾸기 // const found = alertForMiscreant(people); const found = findMiscreant(people); //질의 alertForMiscreant(people);//명령 |
완료 function alertForMiscreant(people){ for(const p of people){ if(p==="조커"){ setOffAlarms(); return ; } if(p==="사루만"){ setOffAlarms(); return ; } } return ""; } function findMiscreant(people){ for(const p of people){ if(p==="조커") return "조커"; if(p==="사루만") return "사루만"; } return ""; } //원래 함수 호출하던 곳, 새로 만든 질의함수로 바꾸기 // const found = alertForMiscreant(people); const found = findMiscreant(people); //질의 alertForMiscreant(people);//명령 |
function alertForMiscreant(people){ if(findMiscreant(people) !=="") setOffAlarms(); } function findMiscreant(people){ for(const p of people){ if(p==="조커") return "조커"; if(p==="사루만") return "사루만"; } return ""; } //원래 함수 호출하던 곳, 새로 만든 질의함수로 바꾸기 // const found = alertForMiscreant(people); const found = findMiscreant(people); //질의 alertForMiscreant(people);//명령 |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
11 - API 리팩터링 - 플래그 인수제거하기 (0) | 2023.09.14 |
---|---|
11 - API 리팩터링 - 매개변수화하기 (0) | 2023.09.13 |
10 - 조건부 로직 간소화 - 제어 플래그를 탈출문으로 바꾸기 (0) | 2023.09.11 |
10 - 조건부 로직 간소화 - 어서션 추가하기 (0) | 2023.09.10 |
10 - 조건부 로직 간소화 - 특이 케이스 추가하기 (0) | 2023.09.09 |