เรามีฟังก์ชัน 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 ขยายตัว บางทีเราอาจเพิ่มพารามิเตอร์การตั้งค่าสถานะเพิ่มเติมเพื่อระบุวิธีการที่จะใช้ภายในฟังก์ชัน
Date
- คุณสามารถจัดหาสตริงและมันสามารถแยกวิเคราะห์เพื่อกำหนดวัน อย่างไรก็ตามวิธีนี้การจัดการพารามิเตอร์ยังทำได้อย่างพิถีพิถันและอาจให้ผลลัพธ์ที่ไม่น่าเชื่อถือ ดูDate
อีกครั้ง มันเป็นไปไม่ได้ที่จะทำสิ่งที่ถูกต้อง - ช่วงเวลาจัดการได้ดีกว่า แต่ก็น่ารำคาญที่จะใช้โดยไม่คำนึงถึง
monthlyPayment
ได้รับ แต่total
ไม่ใช่จำนวนเต็มหลายตัว และวิธีจัดการกับข้อผิดพลาดจุดลอยตัวที่เป็นไปได้หากค่าไม่ได้รับประกันว่าจะเป็นจำนวนเต็ม (เช่นลองด้วยtotal = 0.3
และmonthlyPayment = 0.1
)