Bohrbug — یک خطای برنامهنویسی است که به صورت قطعی رفتار میکند: با دادههای ورودی یکسان، هر بار بدون استثنا تکرار میشود. این نام از مدل اتمی نیلز بور گرفته شده است، جایی که الکترون در مداری کاملاً مشخص حرکت میکند — به همان اندازه قابل پیشبینی که این باگ رفتار میکند. به گفته ویکیپدیا (2026)، Bohrbug در کلاس سادهترین عیوب برای تشخیص قرار میگیرد، زیرا برای تکرار به شرایط خاصی نیاز ندارد.
نکات اصلی
Bohrbug — نوعی خطای برنامهنویسی است که به صورت قطعی ظاهر میشود: با دادههای ورودی یکسان، همیشه به یک خرابی منجر میشود. این اصطلاح توسط محققان جیم گری و آندریاس روتر در کتاب «Transaction Processing: Concepts and Techniques» (1993) وارد گردش علمی شد.
بر خلاف Mandelbug که رفتار خود را به طور آشوبگونه تغییر میدهد، Bohrbug پایدار است: توسعهدهنده میتواند آن را با چشم بسته با ارائه همان پارامترها به سیستم بازتولید کند. این ویژگی آن را به نامزدی ایدهآل برای اشکالزدایی گام به گام در IDE تبدیل میکند.
Bohrbug در تمام مراحل چرخه عمر نرمافزار — از توسعه تا بهرهبرداری — یافت میشود. اغلب در مرحله آزمایش کشف میشود، زیرا مهندسان QA سناریوهای تکراری را اجرا میکنند که به طور تضمینی به خرابی منجر میشوند.
طبق طبقهبندی گری و روتر، Bohrbug عیبی است که سه شرط را برآورده میکند: مجموعه ثابتی از دادههای ورودی، وضعیت یکسان سیستم و نتیجه یکسان خرابی. اگر حداقل یکی از شرایط نقض شود، باگ دیگر «بور» نیست.
نویسندگان تأکید میکنند که Bohrbug لزوماً یک خطای ساده نیست. میتواند از نظر منطقی به دلخواه پیچیده باشد، اما قطعی بودن آن را از سایر انواع خرابیها در طبقهبندی متمایز میکند.
نام Bohrbug از نام فیزیکدان دانمارکی نیلز بور، خالق مدل سیارهای اتم گرفته شده است. تشبیه ساده است: همانطور که الکترون در مدل بور در مداری کاملاً ثابت حرکت میکند، این باگ نیز در هر بار اجرا همان رفتار را تکرار میکند.
گری و روتر این نام را برای تقابل خطاهای قطعی با خطاهای آشوبگونه انتخاب کردند که آنها را Mandelbug نامیدند — به افتخار ریاضیدان بنوآ مندلبرو، بنیانگذار نظریه فراکتالها و آشوب.
جالب است که در ادبیات انگلیسی، اصطلاح Bohrbug اغلب به عنوان مترادف «خطای قطعی» استفاده میشود، اگرچه در محیط فارسی کمتر رایج است. اکثر توسعهدهندگان چنین باگهایی را به سادگی «خطاهای قابل بازتولید» مینامند.
Bohrbug دارای مجموعهای از ویژگیهای متمایز است که شناسایی آن را در میان سایر انواع عیوب نرمافزاری ممکن میسازد. هر ویژگی را به تفصیل بررسی میکنیم.
ویژگی اصلی Bohrbug — پیشبینیپذیری کامل. اگر برنامه با دادههای ورودی مشخصی روی ماشین توسعهدهنده خراب شد، دقیقاً به همان شکل روی ماشین تستر و در محیط عملیاتی خراب خواهد شد. هیچ عامل تصادفی وجود ندارد.
Bohrbug در 100٪ تلاشها بازتولید میشود. این بدان معناست که برای اشکالزدایی آن به ابزارهای خاصی نیاز نیست — IDE معمولی و دیباگر کافی است. توسعهدهنده یک نقطه توقف قرار میدهد، برنامه را اجرا میکند، دادههای ورودی را ارائه میدهد و کد را گام به گام پیمایش میکند.
اگر Bohrbug اصلاح نشود، تا زمان رفع در هر نسخه از برنامه بازتولید خواهد شد. عوامل زمانی — بار CPU، فاز ماه، زمان روز — بر بروز آن تأثیر نمیگذارند.
علل بروز Bohrbug را میتوان به چند دسته تقسیم کرد. درک این دستهها به یافتن سریعتر ریشه مشکل کمک میکند.
شرط نادرست ساخته شده — شایعترین علت Bohrbug. به عنوان مثال، توسعهدهنده از عملگر `||` به جای `&&` استفاده کرد که منجر به اجرای نادرست شاخه کد در هر بار فراخوانی تابع با آرگومانهای مشخص شد.
استفاده از عملگر `<=` به جای `<` یا وضعیت معکوس — منبع کلاسیک Bohrbug. اگر حلقه باید 10 بار اجرا شود، اما به دلیل شرط نادرست 11 بار اجرا میشود، این یک خطای قطعی است که در هر بار اجرا ظاهر میشود.
ثابتهای سختکد شده که با منطق کسب و کار مطابقت ندارند، خرابیهای پایداری ایجاد میکنند. به عنوان مثال، مهلت اتصال به سرور 100 میلیثانیه به جای 5000 تنظیم شده است — اتصال در هر درخواست قطع میشود.
تشخیص Bohrbug — سادهترین کار برای توسعهدهنده در مقایسه با سایر انواع باگها است. ماهیت قطعی امکان استفاده از روشهای استاندارد اشکالزدایی را فراهم میکند.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// خطا: کاربران پریمیوم به جای 10٪، 5٪ تخفیف دریافت میکنند
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
در این مثال Bohrbug آشکار است: با فراخوانی `calculate(1000, true)` متد همیشه 950 را به جای 900 برمیگرداند. سادهترین تست واحد با دادههای ورودی ثابت فوراً مشکل را آشکار میکند.
برای تشخیص Bohrbug، تستهای واحد مؤثرترین ابزار هستند. کافی است تابع را با مجموعهای از تستها با مقادیر مرزی مختلف پوشش دهید و خطای قطعی در اولین اجرا ظاهر میشود.
هنگامی که Bohrbug تشخیص داده شد، اشکالزدایی گام به گام در IDE بهترین راه برای یافتن ریشه است. توسعهدهنده یک نقطه توقف در ورودی تابع قرار میدهد و هر خط را با مشاهده مقادیر متغیرها پیمایش میکند.
Bohrbug با سایر انواع خطاهای برنامهنویسی در یک ویژگی کلیدی — قطعی بودن — تفاوت دارد. مقایسه را در جدول بررسی میکنیم.
| نوع باگ | قابلیت بازتولید | علت | سختی اشکالزدایی |
|---|---|---|---|
| Bohrbug | 100٪ با ورودی یکسان | خطای منطقی | پایین |
| Mandelbug | وابسته به وضعیت | رقابت نخها، زمانبندی | بالا |
| Schrödinbug | تا خواندن کد — 0٪ | آگاهی از خطا | روانشناختی |
| Hindenbug | یکباره | آبشار خرابی | بسیار بالا |
| Heisenbug | در اشکالزدایی تغییر میکند | بهینهسازی کامپایلر | متوسط |
Bohrbug — تنها نوع خطایی است که میتوان در شرایط کنترل شده به طور تضمینی بازتولید کرد. این ویژگی آن را از نظر تشخیصی ایمنترین، اما برای کاربر کمتر خطرناک نمیکند.
Heisenbug — باگی است که در تلاش برای اشکالزدایی ناپدید میشود. بر خلاف Bohrbug، Heisenbug ممکن است به دلیل تغییر زمانبندی اجرای کد در دیباگر بازتولید نشود. توسعهدهندگان مبتدی اغلب این دو نوع را اشتباه میگیرند.
یک نمونه واقعی از Bohrbug در برنامه فروشگاه اینترنتی را بررسی میکنیم. تابع هزینه کل سفارش را با در نظر گرفتن مالیات محاسبه میکند.
public double calculateTotal(double subtotal, double taxRate) {
// خطا: توسعهدهنده taxRate را به صورت درصد تنظیم کرد
// اما فراموش کرد بر 100 تقسیم کند
return subtotal + (subtotal * taxRate);
}
با فراخوانی `calculateTotal(1000, 20)` تابع 21000 را به جای 1200 مورد انتظار برمیگرداند. این یک Bohrbug کلاسیک است: دادههای ورودی یکسان همیشه به همان نتیجه نادرست منجر میشوند. رفع آن ساده است — اضافه کردن تقسیم بر 100.
پس از اصلاح، تابع نرخ مالیات را به درستی پردازش میکند:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
این مثال به وضوح نشان میدهد که Bohrbug میتواند ناشی از سادهترین خطای ریاضی باشد. به همین دلیل است که بازبینی کد و تستهای واحد ابزارهای اصلی پیشگیری از چنین عیوبی هستند.
سوالات متداول
Bohrbug — نوعی از باگ معمولی است که با قطعیت شدید مشخص میشود. هر Bohrbug یک باگ است، اما هر باگی Bohrbug نیست. باگ معمولی ممکن است ناپایدار بازتولید شود یا به عوامل خارجی وابسته باشد.
پایدار Bohrbug به دلیل توانایی آن در بازتولید در هر بار اجرا با دادههای ورودی یکسان نامیده میشود. این ویژگی آن را بر خلاف Mandelbug یا Heisenbug قابل پیشبینی و مناسب برای اشکالزدایی میکند.
اصطلاح Bohrbug توسط جیم گری و آندریاس روتر در سال 1993 در کتاب «Transaction Processing: Concepts and Techniques» معرفی شد. آنها خطاهای برنامهنویسی را بر اساس درجه قطعیت با استفاده از تشبیهات فیزیک و ریاضیات طبقهبندی کردند.
برای رفع سریع Bohrbug لازم است: باگ را در محیط آزمایش بازتولید کنید، کد را گام به گام در دیباگر پیمایش کنید، خط با منطق نادرست را پیدا کنید و تست واحدی بنویسید که رفتار صحیح را بررسی کند.
بله، Bohrbug میتواند از نظر منطقی به دلخواه پیچیده باشد. قطعیت به معنای سادگی نیست. باگ میتواند شامل شرایط متعدد و فراخوانیهای تودرتو باشد، اما اگر پایدار بازتولید شود — این Bohrbug است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.