Bohrbug: چیست، علل بروز و روش‌های رفع آن

نویسنده: IT Sectr منتشر شده: 2026-07-29 زمان مطالعه: 8 دقیقه

Bohrbug — یک خطای برنامه‌نویسی است که به صورت قطعی رفتار می‌کند: با داده‌های ورودی یکسان، هر بار بدون استثنا تکرار می‌شود. این نام از مدل اتمی نیلز بور گرفته شده است، جایی که الکترون در مداری کاملاً مشخص حرکت می‌کند — به همان اندازه قابل پیش‌بینی که این باگ رفتار می‌کند. به گفته ویکی‌پدیا (2026)، Bohrbug در کلاس ساده‌ترین عیوب برای تشخیص قرار می‌گیرد، زیرا برای تکرار به شرایط خاصی نیاز ندارد.

نکات اصلی

  • Bohrbug — یک خطای پایدار است که با داده‌های ورودی یکسان در هر بار اجرا تکرار می‌شود.
  • نام با مدل سیاره‌ای اتم بور مرتبط است — باگ مانند الکترون در مدار قابل پیش‌بینی رفتار می‌کند.
  • تشخیص این باگ‌ها ساده‌ترین است: کافی است شرایط ورودی را ثبت کرده و اشکال‌زدایی را انجام دهید.
  • علل شامل خطاهای منطقی، شرایط مرزی نادرست و اشتباهات تایپی در کد است.
  • تست‌های واحد — ابزار اصلی جلوگیری از Bohrbug در مرحله توسعه است.

Bohrbug چیست؟

Bohrbug — نوعی خطای برنامه‌نویسی است که به صورت قطعی ظاهر می‌شود: با داده‌های ورودی یکسان، همیشه به یک خرابی منجر می‌شود. این اصطلاح توسط محققان جیم گری و آندریاس روتر در کتاب «Transaction Processing: Concepts and Techniques» (1993) وارد گردش علمی شد.

بر خلاف Mandelbug که رفتار خود را به طور آشوب‌گونه تغییر می‌دهد، Bohrbug پایدار است: توسعه‌دهنده می‌تواند آن را با چشم بسته با ارائه همان پارامترها به سیستم بازتولید کند. این ویژگی آن را به نامزدی ایده‌آل برای اشکال‌زدایی گام به گام در IDE تبدیل می‌کند.

Bohrbug در تمام مراحل چرخه عمر نرم‌افزار — از توسعه تا بهره‌برداری — یافت می‌شود. اغلب در مرحله آزمایش کشف می‌شود، زیرا مهندسان QA سناریوهای تکراری را اجرا می‌کنند که به طور تضمینی به خرابی منجر می‌شوند.

تعریف بر اساس گری و روتر

طبق طبقه‌بندی گری و روتر، Bohrbug عیبی است که سه شرط را برآورده می‌کند: مجموعه ثابتی از داده‌های ورودی، وضعیت یکسان سیستم و نتیجه یکسان خرابی. اگر حداقل یکی از شرایط نقض شود، باگ دیگر «بور» نیست.

نویسندگان تأکید می‌کنند که Bohrbug لزوماً یک خطای ساده نیست. می‌تواند از نظر منطقی به دلخواه پیچیده باشد، اما قطعی بودن آن را از سایر انواع خرابی‌ها در طبقه‌بندی متمایز می‌کند.

ریشه نام Bohrbug

نام Bohrbug از نام فیزیکدان دانمارکی نیلز بور، خالق مدل سیاره‌ای اتم گرفته شده است. تشبیه ساده است: همانطور که الکترون در مدل بور در مداری کاملاً ثابت حرکت می‌کند، این باگ نیز در هر بار اجرا همان رفتار را تکرار می‌کند.

گری و روتر این نام را برای تقابل خطاهای قطعی با خطاهای آشوب‌گونه انتخاب کردند که آنها را Mandelbug نامیدند — به افتخار ریاضیدان بنوآ مندلبرو، بنیانگذار نظریه فراکتال‌ها و آشوب.

جالب است که در ادبیات انگلیسی، اصطلاح Bohrbug اغلب به عنوان مترادف «خطای قطعی» استفاده می‌شود، اگرچه در محیط فارسی کمتر رایج است. اکثر توسعه‌دهندگان چنین باگ‌هایی را به سادگی «خطاهای قابل بازتولید» می‌نامند.

ویژگی‌های کلیدی Bohrbug

Bohrbug دارای مجموعه‌ای از ویژگی‌های متمایز است که شناسایی آن را در میان سایر انواع عیوب نرم‌افزاری ممکن می‌سازد. هر ویژگی را به تفصیل بررسی می‌کنیم.

قطعی بودن

ویژگی اصلی Bohrbug — پیش‌بینی‌پذیری کامل. اگر برنامه با داده‌های ورودی مشخصی روی ماشین توسعه‌دهنده خراب شد، دقیقاً به همان شکل روی ماشین تستر و در محیط عملیاتی خراب خواهد شد. هیچ عامل تصادفی وجود ندارد.

قابلیت بازتولید

Bohrbug در 100٪ تلاش‌ها بازتولید می‌شود. این بدان معناست که برای اشکال‌زدایی آن به ابزارهای خاصی نیاز نیست — IDE معمولی و دیباگر کافی است. توسعه‌دهنده یک نقطه توقف قرار می‌دهد، برنامه را اجرا می‌کند، داده‌های ورودی را ارائه می‌دهد و کد را گام به گام پیمایش می‌کند.

پایداری در زمان

اگر Bohrbug اصلاح نشود، تا زمان رفع در هر نسخه از برنامه بازتولید خواهد شد. عوامل زمانی — بار CPU، فاز ماه، زمان روز — بر بروز آن تأثیر نمی‌گذارند.

علل اصلی بروز Bohrbug

علل بروز Bohrbug را می‌توان به چند دسته تقسیم کرد. درک این دسته‌ها به یافتن سریع‌تر ریشه مشکل کمک می‌کند.

خطاهای منطقی

شرط نادرست ساخته شده — شایع‌ترین علت Bohrbug. به عنوان مثال، توسعه‌دهنده از عملگر `||` به جای `&&` استفاده کرد که منجر به اجرای نادرست شاخه کد در هر بار فراخوانی تابع با آرگومان‌های مشخص شد.

خطاهای شرایط مرزی

استفاده از عملگر `<=` به جای `<` یا وضعیت معکوس — منبع کلاسیک Bohrbug. اگر حلقه باید 10 بار اجرا شود، اما به دلیل شرط نادرست 11 بار اجرا می‌شود، این یک خطای قطعی است که در هر بار اجرا ظاهر می‌شود.

ثابت‌های نادرست و اعداد جادویی

ثابت‌های سخت‌کد شده که با منطق کسب و کار مطابقت ندارند، خرابی‌های پایداری ایجاد می‌کنند. به عنوان مثال، مهلت اتصال به سرور 100 میلی‌ثانیه به جای 5000 تنظیم شده است — اتصال در هر درخواست قطع می‌شود.

چگونه Bohrbug را در کد تشخیص دهیم

تشخیص Bohrbug — ساده‌ترین کار برای توسعه‌دهنده در مقایسه با سایر انواع باگ‌ها است. ماهیت قطعی امکان استفاده از روش‌های استاندارد اشکال‌زدایی را فراهم می‌کند.

java
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 با سایر انواع خطاهای برنامه‌نویسی در یک ویژگی کلیدی — قطعی بودن — تفاوت دارد. مقایسه را در جدول بررسی می‌کنیم.

نوع باگقابلیت بازتولیدعلتسختی اشکال‌زدایی
Bohrbug100٪ با ورودی یکسانخطای منطقیپایین
Mandelbugوابسته به وضعیترقابت نخ‌ها، زمان‌بندیبالا
Schrödinbugتا خواندن کد — 0٪آگاهی از خطاروانشناختی
Hindenbugیکبارهآبشار خرابیبسیار بالا
Heisenbugدر اشکال‌زدایی تغییر می‌کندبهینه‌سازی کامپایلرمتوسط

Bohrbug — تنها نوع خطایی است که می‌توان در شرایط کنترل شده به طور تضمینی بازتولید کرد. این ویژگی آن را از نظر تشخیصی ایمن‌ترین، اما برای کاربر کمتر خطرناک نمی‌کند.

چرا Bohrbug و Heisenbug را اشتباه می‌گیرند

Heisenbug — باگی است که در تلاش برای اشکال‌زدایی ناپدید می‌شود. بر خلاف Bohrbug، Heisenbug ممکن است به دلیل تغییر زمان‌بندی اجرای کد در دیباگر بازتولید نشود. توسعه‌دهندگان مبتدی اغلب این دو نوع را اشتباه می‌گیرند.

نمونه Bohrbug در کد

یک نمونه واقعی از Bohrbug در برنامه فروشگاه اینترنتی را بررسی می‌کنیم. تابع هزینه کل سفارش را با در نظر گرفتن مالیات محاسبه می‌کند.

java
public double calculateTotal(double subtotal, double taxRate) {
    // خطا: توسعه‌دهنده taxRate را به صورت درصد تنظیم کرد
    // اما فراموش کرد بر 100 تقسیم کند
    return subtotal + (subtotal * taxRate);
}

با فراخوانی `calculateTotal(1000, 20)` تابع 21000 را به جای 1200 مورد انتظار برمی‌گرداند. این یک Bohrbug کلاسیک است: داده‌های ورودی یکسان همیشه به همان نتیجه نادرست منجر می‌شوند. رفع آن ساده است — اضافه کردن تقسیم بر 100.

نسخه اصلاح شده

پس از اصلاح، تابع نرخ مالیات را به درستی پردازش می‌کند:

java
public double calculateTotal(double subtotal, double taxRatePercent) {
    return subtotal + (subtotal * taxRatePercent / 100.0);
}

این مثال به وضوح نشان می‌دهد که Bohrbug می‌تواند ناشی از ساده‌ترین خطای ریاضی باشد. به همین دلیل است که بازبینی کد و تست‌های واحد ابزارهای اصلی پیشگیری از چنین عیوبی هستند.

سوالات متداول

Bohrbug چه تفاوتی با باگ معمولی دارد؟

Bohrbug — نوعی از باگ معمولی است که با قطعیت شدید مشخص می‌شود. هر Bohrbug یک باگ است، اما هر باگی Bohrbug نیست. باگ معمولی ممکن است ناپایدار بازتولید شود یا به عوامل خارجی وابسته باشد.

چرا Bohrbug را باگ پایدار می‌نامند؟

پایدار Bohrbug به دلیل توانایی آن در بازتولید در هر بار اجرا با داده‌های ورودی یکسان نامیده می‌شود. این ویژگی آن را بر خلاف Mandelbug یا Heisenbug قابل پیش‌بینی و مناسب برای اشکال‌زدایی می‌کند.

چه کسی اصطلاح Bohrbug را معرفی کرد؟

اصطلاح Bohrbug توسط جیم گری و آندریاس روتر در سال 1993 در کتاب «Transaction Processing: Concepts and Techniques» معرفی شد. آنها خطاهای برنامه‌نویسی را بر اساس درجه قطعیت با استفاده از تشبیهات فیزیک و ریاضیات طبقه‌بندی کردند.

چگونه Bohrbug را سریع رفع کنیم؟

برای رفع سریع Bohrbug لازم است: باگ را در محیط آزمایش بازتولید کنید، کد را گام به گام در دیباگر پیمایش کنید، خط با منطق نادرست را پیدا کنید و تست واحدی بنویسید که رفتار صحیح را بررسی کند.

آیا Bohrbug می‌تواند پیچیده باشد؟

بله، Bohrbug می‌تواند از نظر منطقی به دلخواه پیچیده باشد. قطعیت به معنای سادگی نیست. باگ می‌تواند شامل شرایط متعدد و فراخوانی‌های تودرتو باشد، اما اگر پایدار بازتولید شود — این Bohrbug است.

خلاصه

  • Bohrbug — یک خطای قطعی برنامه‌نویسی که در 100٪ موارد با داده‌های ورودی یکسان بازتولید می‌شود.
  • نام از نام فیزیکدان نیلز بور گرفته شده است که مدل اتمی او مبتنی بر مدارهای دقیق است — تشبیهی با رفتار قابل پیش‌بینی باگ.
  • علل اصلی Bohrbug: خطاهای منطقی، شرایط مرزی نادرست، اشتباهات تایپی و ثابت‌های نادرست.
  • تشخیص Bohrbug به دلیل ماهیت قطعی ساده‌ترین در میان همه انواع باگ‌ها است.
  • تست‌های واحد و بازبینی کد — ابزارهای اصلی جلوگیری از Bohrbug در مرحله توسعه.
  • تفاوت با Mandelbug: Bohrbug پایدار و قابل پیش‌بینی است، Mandelbug آشوب‌گونه و وابسته به وضعیت سیستم است.
  • توصیه: هنگام کشف یک باگ پایدار، همیشه با نوشتن تستی که آن را بازتولید می‌کند شروع کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید