شرط مسبق

في برمجة الحاسوب ، الشرط المسبق هو شرط أو مسند يجب أن يكون صحيحًا دائمًا قبل تنفيذ جزء من التعليمات البرمجية أو قبل إجراء عملية في مواصفات رسمية .

إذا تم انتهاك أحد الشروط المسبقة، يصبح تأثير جزء الكود غير محدد، وبالتالي قد يؤدي وظيفته المقصودة أو لا. ويمكن أن تؤدي الشروط المسبقة المفقودة أو غير الكافية أو غير المثبتة رسميًا (أو التي تم إثباتها بشكل خاطئ)، أو التي لم يتم التحقق منها بشكل ثابت أو ديناميكي، إلى مشاكل أمنية ، لا سيما في اللغات غير الآمنة التي لا تتمتع بتصنيف قوي.

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

مثال

تُعرَّف دالة المضروب فقط عندما يكون مُعاملها عددًا صحيحًا أكبر من أو يساوي الصفر. لذا، يتطلب تطبيق دالة المضروب شرطًا مسبقًا هو أن يكون مُعاملها عددًا صحيحًا، وأن يكون هذا المُعامل أكبر من أو يساوي الصفر. بدلاً من ذلك، يمكن استخدام نظام أنواع اللغة لتحديد أن مُعامل دالة المضروب هو عدد طبيعي (عدد صحيح غير مُوقَّع)، وهو ما يمكن التحقق منه رسميًا تلقائيًا بواسطة مدقق أنواع المُصرِّف.

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

في البرمجة الكائنية التوجه

تُعدّ الشروط المسبقة في تطوير البرمجيات الموجهة للكائنات جزءًا أساسيًا من التصميم التعاقدي . كما يشمل التصميم التعاقدي مفاهيم الشروط اللاحقة وثوابت الفئات .

يُحدد الشرط المسبق لأي روتين أي قيود على حالة الكائن ضرورية لتنفيذه بنجاح. من وجهة نظر مطور البرنامج، يُمثل هذا الجزء من العقد المُلزم لمُستدعي الروتين. يلتزم المُستدعي حينها بالتأكد من تحقق الشرط المسبق قبل استدعاء الروتين. ويُعبّر عن مكافأة جهد المُستدعي في الشرط اللاحق للروتين المُستدعى . [ 1 ]

مثال إيفل

تأخذ الدالة في المثال التالي، المكتوبة بلغة إيفل، عددًا صحيحًا كمعامل، ويجب أن تكون هذه القيمة صالحة لساعة معينة من ساعات اليوم، أي من 0 إلى 23 شاملةً. يأتي الشرط المسبق بعد الكلمة المفتاحية `<precondition>` require. ويحدد هذا الشرط أن يكون المعامل أكبر من أو يساوي صفرًا وأقل من 24. valid_argumentيصف الوسم `<precondition>` هذا الشرط المسبق، ويُستخدم لتحديده في حالة حدوث انتهاك له أثناء التشغيل.

set_hour ( a_hour : INTEGER ) -- تعيين قيمة `hour` إلى `a_hour` يتطلب valid_argument : 0 <= a_hour و a_hour < 24 do hour := a_hour ensure hour_set : hour = a_hour end

الشروط المسبقة والإرث

في حالة وجود الوراثة، ترث الفئات الفرعية (الفئات المنحدرة) إجراءاتها مع تطبيق شروطها المسبقة. وهذا يعني أن أي تطبيقات أو إعادة تعريف للإجراءات الموروثة يجب أن تُكتب أيضًا بما يتوافق مع شروطها الموروثة. يمكن تعديل الشروط المسبقة في الإجراءات المعاد تعريفها، ولكن لا يجوز إلا تخفيفها. [ 2 ] أي أن الإجراء المعاد تعريفه قد يُخفف من التزام العميل، ولكنه لا يزيده.

انظر أيضاً

مراجع

  1. ماير، برتراند ، بناء البرمجيات الموجهة للكائنات ، الطبعة الثانية، برنتيس هول ، 1997، ص 342.
  2. ماير، 1997، ص 570-573.