আমাদের একটি এপিআই ফাংশন রয়েছে যা প্রদত্ত শুরু এবং শেষের তারিখের ভিত্তিতে মোট পরিমাণকে মাসিক পরিমাণে বিভক্ত করে।
// 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),
};
}
আমি মনে করি এই পরিবর্তনটি এপিআইকে জটিল করে তুলেছে। এখন আহ্বানকারী মাপদণ্ডগুলি (অগ্রাধিকার ক্রম দ্বারা অর্থাত তারিখ ব্যাপ্তি নিরূপণ করা ব্যবহৃত হচ্ছে অগ্রাধিকার নিতে যা নির্ধারণে হিউরিস্টিক ফাংশন বাস্তবায়ন লুকানো সম্পর্কে চিন্তা করতে প্রয়োজন monthlyPayment
, numMonths
, endDate
)। যদি কোনও কলকারী ফাংশনের স্বাক্ষরটির দিকে মনোযোগ না দেয়, তারা alচ্ছিক পরামিতিগুলির একাধিক পাঠাতে পারে এবং কেন endDate
এড়ানো হচ্ছে তা নিয়ে বিভ্রান্তিতে পড়তে পারে । আমরা ফাংশন ডকুমেন্টেশনে এই আচরণটি নির্দিষ্ট করি।
অতিরিক্তভাবে আমি অনুভব করি এটি একটি খারাপ নজির সেট করে এবং এপিআই-তে এমন দায়িত্ব যুক্ত করে যে এটি নিজের উদ্বেগ করা উচিত নয় (অর্থাত্ এসআরপি লঙ্ঘন)। ধরুন অতিরিক্ত ভোক্তাদের ফাংশন যেমন গণক হিসাবে আরো ব্যবহারের ক্ষেত্রে, সমর্থন করতে চান total
থেকে numMonths
এবং monthlyPayment
প্যারামিটার। এই ফাংশন সময়ের সাথে আরও জটিল হয়ে উঠবে।
আমার পছন্দটি হ'ল ফাংশনটি যেমন ছিল তেমন রাখা এবং পরিবর্তে কলারকে তাদের গণনা করা দরকার endDate
। তবে আমি ভুল হতে পারি এবং ভাবছিলাম যে তাদের করা পরিবর্তনগুলি কোনও এপিআই ফাংশন ডিজাইনের গ্রহণযোগ্য উপায় কিনা were
বিকল্পভাবে, এর মতো পরিস্থিতি পরিচালনার জন্য কি সাধারণ প্যাটার্ন রয়েছে? আমরা আমাদের এপিআই-তে অতিরিক্ত উচ্চ-আদেশ ক্রিয়াকলাপ সরবরাহ করতে পারি যা মূল ফাংশনটি আবৃত করে, তবে এটি এপিআইকে ব্লাস্ট করে। ফাংশনের অভ্যন্তরে কোন পদ্ধতির ব্যবহার করা হবে তা নির্দিষ্ট করে আমরা একটি অতিরিক্ত পতাকা প্যারামিটার যুক্ত করতে পারি।
Date
- আপনি একটি স্ট্রিং সরবরাহ করতে পারে এবং এটি তারিখ নির্ধারণ পার্স করা যাবে না। তবে, এইভাবে ওহ হ্যান্ডলিং প্যারামিটারগুলি খুব চূড়ান্ত হতে পারে এবং অবিশ্বাস্য ফলাফলও পেতে পারে। Date
আবার দেখুন । এটি সঠিকভাবে করা অসম্ভব - মুহুর্তটি এটিকে আরও ভালভাবে পরিচালনা করে তবে নির্বিশেষে এটি ব্যবহার করা খুব বিরক্তিকর।
monthlyPayment
দেওয়া হবে তা কীভাবে পরিচালনা করবেন সে সম্পর্কে ভাবতে চাইতে পারেন তবে total
এটির পূর্ণসংখ্যার একাধিক নয়। এবং এছাড়াও কিভাবে সম্ভব ফ্লোটিং পয়েন্ট roundoff ত্রুটিযুক্ত মোকাবেলা করতে যদি মান ইন্টিজার হতে নিশ্চিত করা হয় না (যেমন সঙ্গে এটি চেষ্টা total = 0.3
এবং monthlyPayment = 0.1
)।