Verilen başlangıç ve bitiş tarihlerine göre toplam tutarı aylık tutarlara ayıran bir API fonksiyonuna sahibiz.
// 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,
};
}
Son zamanlarda, bu API için bir tüketici tarih aralığını başka yollarla belirtmek istedi: 1) bitiş tarihi yerine ay sayısını vererek veya 2) aylık ödemeyi sağlayarak ve bitiş tarihini hesaplayarak. Buna cevaben, API ekibi işlevi şu şekilde değiştirdi:
// 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),
};
}
Bu değişikliğin API'yi karmaşıklaştırdığını hissediyorum. Şimdi Arayan parametreleri (öncelik sırasına göre, yani tarih aralığını hesaplamak için kullanılan içinde tercihini aldığı belirlenmesinde işlevin uygulanması ile gizli sezgisel hakkında endişe gerekiyor monthlyPayment
, numMonths
, endDate
). Arayan, işlev imzasına dikkat etmezse, isteğe bağlı parametrelerin çoğunu gönderebilir ve neden endDate
göz ardı edildiğine ilişkin olarak kafaları karışabilir . Bu davranışı işlev belgelerinde belirtiyoruz.
Ayrıca kendisinin kötü bir emsal teşkil ettiğini ve API'ya kendisiyle ilgilenmemesi gereken sorumluluklar eklediğini hissediyorum (yani SRP'yi ihlal ediyor). Varsayalım ek tüketiciler fonksiyonu böyle hesaplanması gibi daha kullanım durumlarını, desteklemek istiyorsanız total
den numMonths
ve monthlyPayment
parametreler. Bu işlev zamanla daha karmaşık hale gelecektir.
Tercihim, işlevi olduğu gibi tutmak ve bunun yerine arayanın endDate
kendilerini hesaplamasını gerektiriyor . Ancak yanılıyor olabilirim ve yaptıkları değişikliklerin bir API işlevi tasarlamanın kabul edilebilir bir yolu olup olmadığını merak ediyorum.
Alternatif olarak, böyle senaryoları ele almak için ortak bir örnek var mı? API’mizde orijinal işlevi saran daha yüksek dereceli işlevler sağlayabiliriz, ancak bu API'yi engeller. Belki de, işlevin içinde hangi yaklaşımı kullanacağını belirten ek bir flag parametresi ekleyebiliriz.
Date
- Bir dize sağlayabilirsiniz ve tarihini belirlemek için çözümlenebilir. Bununla birlikte, bu şekilde işlem parametreleri de çok hassastır ve güvenilir olmayan sonuçlar doğurabilir. Date
Tekrar gör . Doğru yapmak imkansız değildir - Moment daha iyi işler ancak ne olursa olsun kullanmak çok can sıkıcıdır.
monthlyPayment
, verilen davayı nasıl ele alacağınız hakkında düşünmek isteyebilirsiniz, ancak total
tamsayı değildir. Ayrıca, değerlerin tamsayı olmaları garanti edilmiyorsa, olası kayan nokta yuvarlama hatalarıyla nasıl başa çıkılacağı (örn . total = 0.3
Ve ile deneyin monthlyPayment = 0.1
).