আমি প্রায়শই খুব সংখ্যাসূচক / গাণিতিক প্রোগ্রামগুলির সাথে কাজ করি, যেখানে কোনও ফাংশনের সঠিক ফলাফল আগে থেকেই অনুমান করা শক্ত।
এই জাতীয় কোডের সাথে টিডিডি প্রয়োগ করার চেষ্টা করার সময়, আমি প্রায়শই পরীক্ষার অধীনে কোডটি লেখার পক্ষে সেই কোডটির ইউনিট পরীক্ষা লেখার চেয়ে উল্লেখযোগ্যভাবে সহজ মনে করি, কারণ প্রত্যাশিত ফলাফলটি জানার একমাত্র উপায় হ'ল আলগোরিদম নিজেই প্রয়োগ করা (আমার মধ্যে কিনা মাথা, কাগজে অথবা কম্পিউটারের মাধ্যমে) এটি ভুল অনুভব করে, কারণ আমি অন্য ইউনিটের পরিবর্তে আমার ইউনিট পরীক্ষাগুলি যাচাই করতে পরীক্ষার অধীনে কোডটি কার্যকরভাবে ব্যবহার করছি।
পরীক্ষার অধীনে কোডটির ফলাফল পূর্বাভাস দেওয়া কঠিন হলে ইউনিট পরীক্ষা লেখার জন্য এবং টিডিডি প্রয়োগ করার জন্য কি কোনও প্রযুক্তি আছে?
ফলাফলগুলির পূর্বাভাস দেওয়া কঠিন সহ কোডের একটি (বাস্তব) উদাহরণ:
এমন একটি ফাংশন weightedTasksOnTimeযা প্রতিদিন workPerDayপরিসীমা (0, 24], বর্তমান সময় initialTime> 0, এবং কাজের তালিকা দেওয়া taskArray; প্রতিটি সম্পত্তি সমাপ্ত করার সময় time> 0, নির্ধারিত তারিখ dueএবং গুরুত্ব মূল্য সহ প্রদত্ত কাজ importance; রিটার্ন দেয় পরিসীমাতে একটি স্বাভাবিক মান [0, 1] যে কার্যগুলির dueতারিখের পূর্বে সম্পূর্ণ করা যেতে পারে এমন কার্যগুলির গুরুত্বের প্রতিনিধিত্ব করে যদি প্রতিটি কার্য সম্পাদন করে দেওয়া আদেশ অনুসারে সম্পন্ন হয় তবে taskArrayশুরু করুন initialTime।
এই ফাংশনটি বাস্তবায়নের জন্য অ্যালগরিদম তুলনামূলকভাবে সহজবোধ্য: কার্যগুলিতে পুনরাবৃত্তি taskArray। প্রতিটি কাজের জন্য, যুক্ত timeকরুন initialTime। নতুন সময় <হলে due, importanceএকটি সঞ্চয়ের সাথে যুক্ত করুন। সময়টি বিপরীতমুখী ওয়ার্কপেই দ্বারা সামঞ্জস্য করা হয়। সঞ্চালককে ফেরত দেওয়ার আগে, স্বাভাবিক করার জন্য টাস্ক আমদানির যোগফলকে ভাগ করুন।
function weightedTasksOnTime(workPerDay, initialTime, taskArray) {
let simulatedTime = initialTime
let accumulator = 0;
for (task in taskArray) {
simulatedTime += task.time * (24 / workPerDay)
if (simulatedTime < task.due) {
accumulator += task.importance
}
}
return accumulator / totalImportance(taskArray)
}
আমি বিশ্বাস করি যে উপরের সমস্যাটি সরল করা যায়, এর মূলটি বজায় রেখে মুছে ফেলা workPerDayএবং সাধারণীকরণের প্রয়োজনীয়তা দিয়ে:
function weightedTasksOnTime(initialTime, taskArray) {
let simulatedTime = initialTime
let accumulator = 0;
for (task in taskArray) {
simulatedTime += task.time
if (simulatedTime < task.due) {
accumulator += task.importance
}
}
return accumulator
}
এই প্রশ্নটি এমন পরিস্থিতিগুলিকে সম্বোধন করে যেখানে পরীক্ষার অধীনে কোডটি কোনও বিদ্যমান অ্যালগরিদমের পুনরায় বাস্তবায়ন নয়। কোডটি যদি পুনরায় বাস্তবায়ন হয় তবে এর অভ্যন্তরীণভাবে ফলাফলগুলির পূর্বাভাস দেওয়া সহজ হয়, কারণ অ্যালগরিদমের বিদ্যমান বিশ্বস্ত বাস্তবায়ন প্রাকৃতিক পরীক্ষার ওরাকল হিসাবে কাজ করে।