আমি সম্প্রতি কোডের একটি ছোট অংশ লিখেছিলাম যা মানব-বান্ধব উপায়ে ইঙ্গিত দেয় যে কোন ইভেন্টটি কত পুরানো। উদাহরণস্বরূপ, এটি ইঙ্গিত করতে পারে যে ঘটনাটি "তিন সপ্তাহ আগে" বা "এক মাস আগে" বা "গতকাল" হয়েছিল।
প্রয়োজনীয়তাগুলি তুলনামূলকভাবে পরিষ্কার ছিল এবং এটি পরীক্ষা চালিত বিকাশের জন্য একটি উপযুক্ত কেস case আমি পরীক্ষাগুলি একের পর এক লিখেছিলাম, প্রতিটি পরীক্ষায় পাসের জন্য কোডটি প্রয়োগ করে এবং সবকিছু ঠিকঠাকভাবে কাজ করে বলে মনে হয়েছিল। কোনও বাগ প্রযোজনায় উপস্থিত না হওয়া পর্যন্ত।
এখানে কোডের প্রাসঙ্গিক অংশটি দেওয়া হল:
now = datetime.datetime.utcnow()
today = now.date()
if event_date.date() == today:
return "Today"
yesterday = today - datetime.timedelta(1)
if event_date.date() == yesterday:
return "Yesterday"
delta = (now - event_date).days
if delta < 7:
return _number_to_text(delta) + " days ago"
if delta < 30:
weeks = math.floor(delta / 7)
if weeks == 1:
return "A week ago"
return _number_to_text(weeks) + " weeks ago"
if delta < 365:
... # Handle months and years in similar manner.
পরীক্ষাগুলি আজ, গতকাল, চার দিন আগে, দু'সপ্তাহ আগে, এক সপ্তাহ আগে, ইত্যাদি ঘটনার ঘটনা যাচাই করছিল এবং কোডটি সেই অনুযায়ী তৈরি করা হয়েছিল।
আমি যেটা মিস করেছি তা হ'ল একটি ঘটনা গতকালের আগের একদিন আগে ঘটতে পারে, যখন একদিন আগে ছিল: উদাহরণস্বরূপ, ছাব্বিশ ঘন্টা আগে ঘটে যাওয়া ঘটনাটি একদিন আগের ঘটনা ছিল, যখন গতকাল ঠিক ঠিক যদি আজ সকাল ১০ টা না হয় তবে এটি একটি বিষয় কিছু, তবে যেহেতু এটি delta
একটি পূর্ণসংখ্যা, তাই এটি কেবল একটি হবে। এই ক্ষেত্রে, অ্যাপ্লিকেশনটি "একদিন আগে" প্রদর্শন করে, যা সম্ভবত কোডটিতে অপ্রত্যাশিত এবং হাতছাড়া। এটি যুক্ত করে স্থির করা যেতে পারে:
if delta == 1:
return "A day ago"
ঠিক গণনা করার পরে delta
।
বাগের একমাত্র নেতিবাচক পরিণতি হ'ল আমি কীভাবে এই ঘটনাটি ঘটতে পারে তা ভেবে আধা ঘন্টা নষ্ট করেছিলাম (এবং বিশ্বাস করে যে কোডের ইউটিসির অভিন্ন ব্যবহার সত্ত্বেও এটি টাইম অঞ্চলগুলির সাথে সম্পর্কযুক্ত) তবে এর উপস্থিতি আমাকে বিরক্ত করছে। এটি ইঙ্গিত করে যে:
- এ জাতীয় সাধারণ উত্স কোডেও যৌক্তিক ভুল করা খুব সহজ।
- পরীক্ষা চালিত বিকাশ কোনও কাজে দেয়নি।
উদ্বেগজনক বিষয় হ'ল আমি দেখতে পাচ্ছি না যে এই জাতীয় বাগগুলি কীভাবে এড়ানো যায়। কোড লেখার আগে আরও চিন্তা করা ছাড়াও আমি একমাত্র উপায়টি মনে করি যে আমি বিশ্বাস করি সেগুলি যে কখনও ঘটবে না তার পক্ষে প্রচুর পরিমাণে যুক্তি যুক্ত করা (যেমন আমি বিশ্বাস করি যে একদিন আগে অবশ্যই গতকাল ছিল), এবং তারপরে প্রতিটি সেকেন্ডের জন্য লুপ করা for গত দশ বছর ধরে, যে কোনও দাবি লঙ্ঘন যাচাই করা খুব জটিল বলে মনে হচ্ছে checking
আমি কীভাবে এই বাগটি প্রথম স্থানে তৈরি করা এড়াতে পারি?