지정된 시작 및 종료 날짜를 기준으로 총 금액을 월별 금액으로 분류하는 API 함수가 있습니다.
// JavaScript
function convertToMonths(timePeriod) {
// ... returns the given time period converted to months
}
function getPaymentBreakdown(total, startDate, endDate) {
const numMonths = convertToMonths(endDate - startDate);
return {
numMonths,
monthlyPayment: total / numMonths,
};
}
최근에이 API의 소비자는 1) 종료 날짜 대신 개월 수를 제공하거나 2) 월별 지불을 제공하고 종료 날짜를 계산하여 다른 방법으로 날짜 범위를 지정하려고했습니다. 이에 대한 응답으로 API 팀은 기능을 다음과 같이 변경했습니다.
// JavaScript
function addMonths(date, numMonths) {
// ... returns a new date numMonths after date
}
function getPaymentBreakdown(
total,
startDate,
endDate /* optional */,
numMonths /* optional */,
monthlyPayment /* optional */,
) {
let innerNumMonths;
if (monthlyPayment) {
innerNumMonths = total / monthlyPayment;
} else if (numMonths) {
innerNumMonths = numMonths;
} else {
innerNumMonths = convertToMonths(endDate - startDate);
}
return {
numMonths: innerNumMonths,
monthlyPayment: total / innerNumMonths,
endDate: addMonths(startDate, innerNumMonths),
};
}
이 변경으로 인해 API가 복잡해집니다. 이제 호출자는 날짜 범위를 계산하는 데 사용되는 매개 변수 (즉 monthlyPayment
, 우선 순위 numMonths
,, endDate
) 를 결정하는 데있어 함수의 구현에 숨겨진 휴리스틱에 대해 걱정할 필요가 있습니다 . 호출자가 함수 서명에주의를 기울이지 않으면 여러 선택적 매개 변수를 보내고 왜 endDate
무시 되는지 에 대해 혼란 스러울 수 있습니다. 함수 문서에서이 동작을 지정합니다.
또한 나는 그것이 선례가 나쁜 것으로 생각하고 API와 관련해서는 안되는 책임을 추가합니다 (예 : SRP 위반). 추가 소비자 total
가 numMonths
및 monthlyPayment
매개 변수 계산과 같은 더 많은 사용 사례를 지원하는 함수를 원한다고 가정 합니다. 이 기능은 시간이 지남에 따라 점점 더 복잡해질 것입니다.
선호하는 것은 함수를 그대로 유지하고 대신 호출자가 endDate
스스로 계산 하도록 요구하는 것 입니다. 그러나, 내가 틀렸을 수도 있고 변경 사항이 API 기능을 설계하는 데 적합한 방법인지 궁금합니다.
또는 이와 같은 시나리오를 처리하기위한 일반적인 패턴이 있습니까? 우리는 원래 함수를 감싸는 추가 고차 함수를 API에 제공 할 수 있지만, 이는 API를 팽창시킵니다. 함수 내부에서 사용할 접근법을 지정하는 추가 플래그 매개 변수를 추가 할 수 있습니다.
monthlyPayment
주어진 값이지만 total
정수의 배수가 아닌 경우를 처리하는 방법에 대해 생각할 수 있습니다 . 또한 값이 정수가 아닌 경우 부동 소수점 반올림 오류를 처리하는 방법 (예 : total = 0.3
및로 시도 monthlyPayment = 0.1
).