صفر و عددهای منفی رو نباید یک گروه مبهم به اسم «ورودی کوچک» بدونیم. ممکنه قرارداد برای هرکدوم رفتار مستقلی بخواد. مثلاً محدودکردن مقدار به حداقل صفر یعنی منفیها صفر بشن، نه اینکه قدرمطلق بگیریم. abs برای فاصله از صفر مناسبه، اما برای حذف مقدار منفی از شمارش یا موجودی الزاماً قرارداد درست نیست.
مثال تعداد قابل نمایش رو با max(0,value) میسازه. در سؤال یک پیادهسازی abs داریم و باید ببینی کدام ورودی، باگش رو آشکار میکنه. خطای رایج انتخاب صفره چون «مرزی» به نظر میاد؛ اگر دو نسخه در صفر برابرن، اون تست این باگ خاص رو تشخیص نمیده. تست مؤثر باید در نقطهای باشه که رفتار مورد انتظار و رفتار خراب جدا میشن. ورودی مثبت هم برای هر دو نسخه یکسانه، پس برای این سؤال قدرت تشخیص نداره. قبل از جواب، خروجی قرارداد و خروجی کد خراب رو برای هر گزینه کنار هم حساب کن.
✍️ مثال حلشده:
def clamp_zero(value):
return max(0, value)
assert clamp_zero(-4) == 0
assert clamp_zero(0) == 0
assert clamp_zero(3) == 3
حالا نوبت توئه: قرارداد میگوید عدد منفی به 0 تبدیل شود و صفر/مثبت بدون تغییر بماند، اما تابع خراب abs(value) برمیگرداند. کدام تست این باگ را واقعاً آشکار میکند؟ انتظار را از قرارداد محدودسازی بگیر، نه از تعریف قدرمطلق.
فعالیت شما
قرارداد میگوید عدد منفی به 0 تبدیل شود و صفر/مثبت بدون تغییر بماند، اما تابع خراب abs(value) برمیگرداند. کدام تست این باگ را واقعاً آشکار میکند؟ انتظار را از قرارداد محدودسازی بگیر، نه از تعریف قدرمطلق.