في المقال المتعلق بتقوية المكتبة القياسية، رأينا أن كثيرًا من متطلبات المكتبة يُعبَّر عنها بوصفها "عقودًا". يستكشف هذا المنشور العقود في C++26 وكيفية تطبيقها على شيفرتنا الخاصة.
يبدأ النقاش بمثال بسيط: دالة تُرجع قيمة من std::vector عند فهرس معين. تقليديًا، يُفرض شرط صلاحية الفهرس باستخدام assert داخل جسم الدالة. لهذا النهج عيوب. يعيش الشرط في التنفيذ، لذا فإن من يقرأ التصريح وحده يرى vector وفهرسًا دون العلاقة بينهما. كما أن التأكيدات تتحكم بها NDEBUG فقط، التي تزيل الفحص تمامًا عند تعريفها.
تنقل عقود C++26، التي قُدِّمت عبر P2900، الشرط إلى توقيع الدالة باستخدام بند pre(...) الموضوع بعد قائمة المعاملات. يذكر هذا الشرط المسبق شرطًا يُتوقع تحققه عند دخول الدالة. ويمكن أن يظهر المتطلب نفسه في التصريح، فيصبح مرئيًا لكل من يقرأ الواجهة البرمجية. تقدم العقود عدة دلالات للتقييم، منها تجاهل الفحص، أو الإبلاغ عن الانتهاك والاستمرار، أو إنهاء البرنامج، ويحدد تنفيذ المترجم الخيارات المتاحة وكيفية اختيارها.
تميّز العقود أيضًا بين ما يجب على المستدعي توفيره وما تَعِد الدالة بإرجاعه. وتعبّر الشروط اللاحقة، المقدَّمة بالبند post، عن هذه الوعود دون الحاجة إلى فحوص يدوية قبل كل عبارة return. وهذا يجعل العقود مفيدة في توثيق الواجهات البرمجية حتى عند تعطيل الفحص أثناء التشغيل.
يختتم المقال بمثال كامل للشرط المسبق، ويغطي موضوعات إضافية مثل الشروط اللاحقة، وموضع العقود في التصريحات والتعريفات، وخيارات المترجم، وتفاصيل قد تفاجئ المطورين.
المصدر: Hacker News · لخّصه HeadlinesBriefing