انتقل إلى المحتوى
Topos Uranos

ملخص

يختم هذا الدرس الوحدة الثامنة، ويختم معها الدورة. فهو يجمع ما حقّقته دروس الوحدة الثلاثة؛ ويعيد بناء سلسلة المفاهيم الممتدة من واجهة الوحدة النمطية إلى تصحيح الأخطاء بوصفه منهجًا؛ ويفصل ما يصحّ من ذلك في أي لغة عمّا يخصّ C++؛ ويعرض انتهاك قاعدة التعريف الواحد الذي لا يشخّصه أحد، ويجمع في قائمة واحدة كل السلوك غير المعرَّف في الدورة مع ما يكشف كل حالة؛ ويكرّر في تقييم الخروج مهارات تقييم الدخول؛ ويقترح ستة تحدّيات تجمع الوحدة؛ وينتهي بالمشروع النهائي للدورة، محدَّد المواصفات بدقة، مع سلّم تقديره، في أربع مراحل، لكلٍّ منها حلّ مرجعي جرى التحقق منه.

أهداف التعلم

  1. تنظيم برنامج في عدة وحدات نمطية ذات ملفات ترويسة وحرّاس تضمين وعقود، وترجمته ترجمة منفصلة، وتشخيص رسائل الرابط.
  2. اختبار وحدة نمطية انطلاقًا من مواصفاتها، ببرنامج اختبارات آلية يُنفَّذ تحت الكاشفات، والتحقق بالتوكيدات مما لا يمكن أن يحدث.
  3. تحديد موضع خطأ بمنهج (إعادة إظهاره، واختزاله، وصوغ الفرضيات، والتنصيف) وبمصحّح الأخطاء، وتوثيق التحقيق.
  4. التعرّف على السلوك غير المعرَّف الذي عرضته الدورة، مع ما يكشف كل حالة، وعلى انتهاك قاعدة التعريف الواحد الذي لا يشخّصه أحد.
  5. دمج الدورة كلها في مشروع: تحديد المواصفات، والتفكيك، والبناء، والاختبار، وقياس الكلفة، وتصحيح أخطاء برنامج لإدارة بيانات جدولية.

ما حقّقته الوحدة

وضعت الوحدة لنفسها غاية أن تعلّم تنظيم البرامج التي لم تعد تتّسع لملف واحد ولا للذهن، والتحقق من صحتها وتصحيح أخطائها. وقد تحقّقت الغاية استنادًا إلى ما أعلنت المقدمة أنه معلوم: التصريح والتعريف، والترجمة والربط، والعقد، واللامتغير، والبحث الثنائي. أما برنامج فهرس الكتب الذي افتُتحت به الوحدة، وكان يتّسع لملف واحد، وينسخ parseInt مرة أخرى، ويُسقط بصمت «مئة عام من العزلة» لأنه كتب < حيث قالت المواصفات «مع شمول الطرفين»، فيُعاد كتابته في آخر فقرة من هذا الدرس مشروعًا نهائيًا: أربع وحدات نمطية ذات عقود، وبرنامج رئيسي يجيب عن الأوامر، وبرنامج اختبارات فيه خمس وعشرون حالة. واثنتان من هذه الحالات، «بين، الحدود» و«بين، سنة واحدة»، تفشلان مع شرط البرنامج الأصلي، ولذلك لا يمكن أن يعود الخطأ دون أن ينتبه إليه أحد.

ملفات متعددة ومكتبات خاصة

قسّم درس ملفات متعددة ومكتبات خاصة البرنامج إلى ملف ترويسة يصرّح، وملف تنفيذ يعرّف، وmain.cpp يستعمل. وعرض حرّاس التضمين، الذين يمنعون التضمين المزدوج داخل وحدة ترجمة واحدة؛ وقاعدة التعريف الواحد، التي تفسّر «multiple definition» و«undefined reference» وتمنح inline معناه الحالي بوصفه إذنًا؛ والترجمة المنفصلة بالخيار -c، التي لا تعيد ترجمة إلا الملفات الكائنية التي تغيّرت مصادرها أو ملفات ترويستها؛ ومكتبة خاصة بدوال من دروس مضت.

الاختبار

علّم درس اختبار البرامج اشتقاق الحالات من المواصفات، بحسب المناطق والحدود والحالات الخاصة، مع حساب النتيجة المتوقعة بطريق آخر؛ وكتابة برنامج اختبارات آلية لا يبلّغ إلا عن الإخفاقات وينتهي بالرمز 0 أو 1؛ واستعمال assert لما لا يمكن أن يحدث، مع العلم بأن -DNDEBUG يمحوه مع شرطه؛ والاختبار وقت الترجمة بـstatic_assert وconstexpr؛ وتنفيذ الاختبارات مع الكاشفات (كاشف أخطاء الذاكرة AddressSanitizer، وكاشف السلوك غير المعرَّف UndefinedBehaviorSanitizer). ويقوم كل ذلك على تحذير ديكسترا: الاختبار يُظهر وجود الأخطاء، ولا يُظهر غيابها أبدًا.

تصحيح الأخطاء

عرض درس تصحيح أخطاء البرامج تصحيح الأخطاء منهجًا تجريبيًا: إعادة إظهار العطل، وصوغ فرضيات قابلة للدحض، والفصل بينها بالتجارب، وتنصيف المقطع المشتبه فيه. وفصّل الأداة (-g دون تحسين، وإعداد Visual Studio Code في الأنظمة الثلاثة، وجلسة حقيقية من GDB، ونقاط التوقف البسيطة والمشروطة، والخطوات، ومكدّس الاستدعاءات) والاستراتيجيات التي تفوقها قيمةً: اختزال الحالة، والبحث عن آخر نقطة صحيحة بالتوكيدات، والبدء من أول إطار يخصّنا في تقرير الكاشف.