Chúng tôi có chức năng API chia tổng số tiền thành số tiền hàng tháng dựa trên ngày bắt đầu và ngày kết thúc cụ thể.
// 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,
};
}
Gần đây, một người tiêu dùng cho API này muốn chỉ định phạm vi ngày theo các cách khác: 1) bằng cách cung cấp số tháng thay vì ngày kết thúc hoặc 2) bằng cách cung cấp khoản thanh toán hàng tháng và tính ngày kết thúc. Để đáp ứng điều này, nhóm API đã thay đổi chức năng như sau:
// 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),
};
}
Tôi cảm thấy sự thay đổi này làm phức tạp API. Bây giờ người gọi cần phải lo lắng về các chẩn đoán ẩn với thực hiện của chức năng trong việc xác định các thông số chụp ưu tiên trong được sử dụng để tính toán phạm vi ngày (tức là bởi thứ tự ưu tiên monthlyPayment
, numMonths
, endDate
). Nếu một người gọi không chú ý đến chữ ký hàm, họ có thể gửi nhiều tham số tùy chọn và bị nhầm lẫn về lý do tại sao endDate
bị bỏ qua. Chúng tôi chỉ định hành vi này trong tài liệu chức năng.
Ngoài ra, tôi cảm thấy nó thiết lập một tiền lệ xấu và thêm trách nhiệm cho API mà nó không nên quan tâm (ví dụ như vi phạm SRP). Giả sử người tiêu dùng bổ sung muốn chức năng hỗ trợ nhiều trường hợp sử dụng hơn, chẳng hạn như tính toán total
từ numMonths
và monthlyPayment
tham số. Chức năng này sẽ ngày càng phức tạp hơn theo thời gian.
Sở thích của tôi là giữ chức năng như cũ và thay vào đó yêu cầu người gọi endDate
tự tính toán . Tuy nhiên, tôi có thể sai và tự hỏi liệu những thay đổi họ thực hiện có phải là một cách chấp nhận được để thiết kế một hàm API hay không.
Ngoài ra, có một mô hình chung để xử lý các tình huống như thế này? Chúng tôi có thể cung cấp thêm các hàm bậc cao hơn trong API bao bọc hàm ban đầu, nhưng điều này làm mờ API. Có lẽ chúng ta có thể thêm một tham số cờ bổ sung chỉ định cách tiếp cận nào được sử dụng bên trong hàm.
Date
- bạn có thể cung cấp một chuỗi và nó có thể được phân tích cú pháp để xác định ngày. Tuy nhiên, cách xử lý oh này cũng có thể rất khó và có thể tạo ra kết quả không đáng tin cậy. Xem Date
lại. Không phải là không thể làm đúng - Khoảnh khắc xử lý nó tốt hơn nhưng rất khó sử dụng.
monthlyPayment
được đưa ra nhưng total
không phải là bội số nguyên của nó. Và cũng là cách xử lý các lỗi làm tròn dấu phẩy động có thể xảy ra nếu các giá trị không được đảm bảo là số nguyên (ví dụ: thử với total = 0.3
và monthlyPayment = 0.1
).