हमारे पास एक एपीआई फ़ंक्शन है जो दी गई शुरुआत और समाप्ति तिथियों के आधार पर मासिक राशि में कुल राशि को तोड़ता है।
// 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,
};
}
हाल ही में, इस एपीआई के लिए एक उपभोक्ता अन्य तरीकों से तारीख सीमा निर्दिष्ट करना चाहता था: 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),
};
}
मुझे लगता है कि यह परिवर्तन एपीआई को जटिल बनाता है। अब फोन करने वाले मानकों (प्राथमिकता के क्रम से यानी तिथि सीमा की गणना करने के इस्तेमाल किया जा रहा में वरीयताओं पर भी विचार जो निर्धारित करने में heuristics समारोह के कार्यान्वयन के साथ छिपा हुआ के बारे में चिंता करने की जरूरत है monthlyPayment
, numMonths
, endDate
)। यदि कोई कॉलर फ़ंक्शन हस्ताक्षर पर ध्यान नहीं देता है, तो वे कई वैकल्पिक पैरामीटर भेज सकते हैं और भ्रमित हो सकते हैं कि क्यों endDate
अनदेखा किया जा रहा है। हम फ़ंक्शन प्रलेखन में इस व्यवहार को निर्दिष्ट करते हैं।
इसके अतिरिक्त मुझे लगता है कि यह एक बुरी मिसाल कायम करता है और एपीआई के लिए जिम्मेदारियों को जोड़ता है कि इसे खुद से चिंता नहीं करनी चाहिए (यानी एसआरपी का उल्लंघन करना)। मान लीजिए कि अतिरिक्त उपभोक्ता चाहते हैं कि फ़ंक्शन अधिक उपयोग के मामलों का समर्थन करें, जैसे total
कि numMonths
और monthlyPayment
मापदंडों से गणना करना। यह फ़ंक्शन समय के साथ अधिक से अधिक जटिल हो जाएगा।
मेरी प्राथमिकता समारोह को बनाए रखने की है और इसके बजाय फोन करने वाले को endDate
खुद की गणना करने की आवश्यकता है । हालांकि, मैं गलत हो सकता हूं और सोच रहा था कि क्या वे बदलाव एक एपीआई फ़ंक्शन को डिजाइन करने के लिए एक स्वीकार्य तरीका थे।
वैकल्पिक रूप से, क्या इस तरह से परिदृश्यों को संभालने के लिए एक सामान्य पैटर्न है? हम अपने एपीआई में अतिरिक्त उच्च-क्रम के कार्य प्रदान कर सकते हैं जो मूल फ़ंक्शन को लपेटते हैं, लेकिन यह एपीआई को फूलता है। हो सकता है कि हम एक अतिरिक्त ध्वज पैरामीटर को निर्दिष्ट कर सकें, जो फ़ंक्शन के अंदर उपयोग करने के लिए निर्दिष्ट करता है।
Date
- आप एक स्ट्रिंग की आपूर्ति कर सकते हैं और यह तिथि निर्धारित करने के लिए पार्स किया जा सकता। हालांकि, इस तरह ओह हैंडलिंग पैरामीटर भी बहुत बारीक हो सकते हैं और अविश्वसनीय परिणाम उत्पन्न कर सकते हैं। देखें Date
फिर से। यह सही करना असंभव नहीं है - पल इसे बेहतर तरीके से संभालता है लेकिन यह परवाह किए बिना उपयोग करने के लिए बहुत कष्टप्रद है।
monthlyPayment
दिया गया है उस मामले को कैसे संभालना है, लेकिन total
इसका एक पूर्णांक एकाधिक नहीं है। और यह भी कि कैसे संभव फ़्लोटिंग पॉइंट राउंडऑफ़ त्रुटियों से निपटने के लिए यदि मान पूर्णांक होने की गारंटी नहीं है (जैसे इसके साथ प्रयास करें total = 0.3
और monthlyPayment = 0.1
)।