개요
조건 문의 형태는 보통 두 가지다.
하나는 참 또는 거짓 분기 모두 정상동작인 경우
다른 하나는 두 분기 중 한 쪽만 정상 동작인 경우다.
참 또는 거짓이 모두 정상 동작인 경우 if/else를 쓰자
한 쪽만 정상인 경우 비정상인 분기에서 return문으로 함수를 탈출한다. 이를 보호구문이라 한다.
함수는 진입점과 반환점이 하나여야만 한다는 규칙을 반드시 준수할 필요 없다.
반환점이 여러 개일 때 코드가 명확해진다면 반환점을 여러 개 두는 것을 피하지 말자
진입점은 어차피 언어 차원에서 강제한다.
예시
직원 급여 계산하는 코드
function payAmount(employee){ let result; if(employee.isSeparated){//퇴사한 직원 result = {amount:0,reasonCode:"SEP"}; }else{ if(employee.isRetired){//은퇴한 직원 result = {amount:0, reasonCode:"RET"}; }else{//급여 계산 로직 lorem.ipsum(dolor.sitAmet); consectetur(adipiscing).elit(); sed.do.eiusmod = tempor.incididunt.ut(labore) && dolore(magna.aliqua); ut.enim.ad(minim.veniam); result = someFinalComputation(); } } } |
function payAmount(employee){ let result; //가장 바깥조건부터 보호구문으로 변경 if(employee.isSeparated){return {amount:0,reasonCode:"SEP"};} if(employee.isRetired){ result = {amount:0, reasonCode:"RET"}; }else{//급여 계산 로직 lorem.ipsum(dolor.sitAmet); consectetur(adipiscing).elit(); sed.do.eiusmod = tempor.incididunt.ut(labore) && dolore(magna.aliqua); ut.enim.ad(minim.veniam); result = someFinalComputation(); } } |
function payAmount(employee){ let result; if(employee.isSeparated){return {amount:0,reasonCode:"SEP"};} if(employee.isRetired){ return {amount:0, reasonCode:"RET"};} //급여 계산 로직 lorem.ipsum(dolor.sitAmet); consectetur(adipiscing).elit(); sed.do.eiusmod = tempor.incididunt.ut(labore) && dolore(magna.aliqua); ut.enim.ad(minim.veniam); result = someFinalComputation(); } |
function payAmount(employee){ if(employee.isSeparated){return {amount:0,reasonCode:"SEP"};} if(employee.isRetired){ return {amount:0, reasonCode:"RET"};} //급여 계산 로직 lorem.ipsum(dolor.sitAmet); consectetur(adipiscing).elit(); sed.do.eiusmod = tempor.incididunt.ut(labore) && dolore(magna.aliqua); ut.enim.ad(minim.veniam); return someFinalComputation(); } |
예시:조건 반대로 만들기
function adjustedCapital(anInstrument){ let result = 0; if(anInstrument.capital > 0){ if(anInstrument.interestRate > 0 && anInstrument.duration > 0){ result = (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; } } return result; } |
function adjustedCapital(anInstrument){ let result = 0; //반대로 해서 보호구문으로 만듦 if(anInstrument.capital <= 0){ return result;} if(anInstrument.interestRate > 0 && anInstrument.duration > 0){ result = (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; } return result; } |
function adjustedCapital(anInstrument){ let result = 0; if(anInstrument.capital <= 0){ return result;} if(!(anInstrument.interestRate > 0 && anInstrument.duration > 0)){ return result; } result = (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; return result } |
function adjustedCapital(anInstrument){ let result = 0; if(anInstrument.capital <= 0){ return result;} //not 조건 제거 if(anInstrument.interestRate <= 0 || anInstrument.duration <= 0){ return result; } result = (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; return result } |
function adjustedCapital(anInstrument){ let result = 0; //조건식 통합 if(anInstrument.capital <= 0 || anInstrument.interestRate <= 0 || anInstrument.duration <= 0){ return result;} result = (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; return result } |
function adjustedCapital(anInstrument){ if(anInstrument.capital <= 0 || anInstrument.interestRate <= 0 || anInstrument.duration <= 0){ return 0;} return (anInstrument.income / anInstrument.duration) * anInstrument.adjustmentFactor; } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
10 - 조건부 로직 간소화 - 특이 케이스 추가하기 (0) | 2023.09.09 |
---|---|
10 - 조건부 로직 간소화 - 조건부 로직을 다형성으로 바꾸기 (0) | 2023.09.08 |
10 - 조건부 로직 간소화 - 조건식 통합하기 (0) | 2023.09.06 |
10 - 조건부 로직 간소화 - 조건문 분해하기 (0) | 2023.09.05 |
09 - 데이터 조직화 - 매직 리터럴 바꾸기 (0) | 2023.09.04 |