رقم سحري

الرقم السحري في برمجة الحاسوب هو مصطلح يُشير إلى قيمة فريدة ذات معنى غير مُفسَّر أو تكرارات متعددة، ويُفضَّل استبدالها بثابت مُسمَّى، أو إلى قيمة رقمية أو نصية ثابتة تُستخدم لتحديد صيغة ملف أو بروتوكول (للملفات، أو إلى قيمة فريدة مميزة يصعب الخلط بينها وبين معانٍ أخرى (كالمُعرِّفات الفريدة العالمية).

يُمكن أن يُشير مُصطلح الرقم السحري أيضًا إلى النمط المعاكس لاستخدام الأرقام مباشرةً في ترميز المصدر، وهو ما يُخالف إحدى أقدم قواعد البرمجة الواردة في أدلة لغات برمجة مثل كوبول وفورتران بي إل/1 التي يعود تاريخ تطويرها إلى عقد الستينيات من القرن العشرين.

 الأهمية 
تلعب الأرقام السحرية دورًا هامًا في النصوص البرمجية، إذ يُخفي استخدام الأرقام السحرية غير المُسماة نية المطورين في اختيار هذا الرقم، كما يزيد من فرص حدوث أخطاء دقيقة، ويُصعّب تعديل البرنامج وتوسيعه في المستقبل. فعلى سبيل المثال، يصعُب معرفة ما إذا كان كل رقم في العدد 3.14159265358979323846 مكتوبًا بشكل صحيح، أو ما إذا كان من الممكن اختصار الثابت إلى 3.14159 دون التأثير على وظائف البرنامج بسبب دقته المنخفضة. إن استبدال جميع الأرقام السحرية المهمة بثوابت مُسمّاة (تُسمى أيضًا المتغيرات التوضيحية) يُسهّل قراءة البرامج وفهمها وصيانتها. كذلك يمكن أن تُؤدي الأسماء المُختارة لتكون ذات معنى في سياق البرنامج إلى ترميز يسهل على مُطوّرها فهمها، حتى لو لم يكن المؤلف الأصلي (أو حتى المؤلف الأصلي بعد مرور فترة زمنية). ومن الأمثلة على الثوابت المُسمّاة بطريقة غير مُفيدة int SIXTEEN = 16 ، بينما قد يقدم int NUMBER_OF_BITS = 16 is mo وصفًا أكثر وضوحًا.

لا تقتصر المشاكل المُرتبطة بـالأرقام السحرية المذكورة هنا على الأنواع العددية، بل يُطبّق هذا المصطلح أيضًا على أنواع بيانات أخرى حيث يكون استخدام ثابت مُسمّى أكثر مرونةً ووضوحًا. وبالتالي، فإن استخدام const string testUserName = "John" يكون أفضل من الظهور المتكرر للرقم السحري ' "John"في مجموعة الاختبار.

 الأمثلة 
في المثال التالي، والذي يحسب السعر بعد الضريبة، يُعد الرقم 1.05 رقمًا سحريًا:
 price_tax = 1.05 * price
يمكن تحسين المثال السابق بإضافة متغير مُسمّى وصفيًا:
 TAX = 0.05
 price_tax = (1.0 + TAX) * price

 مراجع 



تصنيف:برمجة
تصنيف:تنقيح (حوسبة)
تصنيف:علم الحاسوب
تصنيف:نظرية المعلومات
تصنيف:نماذج مضادة