ملخص
يختم هذا الدرس الوحدة الخامسة من الدورة، المخصّصة للدوال. فهو يعيد بناء سلسلة المفاهيم التي تمتد من التصريح بالدالة إلى الاستدعاء الذاتي، مرورًا بمكدس الاستدعاءات، والعقد، وتمرير الوسائط، ونطاق رؤية المتغيرات ومدة حياتها، والتصميم بالتنقيح التدريجي؛ ويفصل ما يصحّ من ذلك في أي لغة عمّا يخصّ C++؛ ويجمع السلوك غير المعرَّف في الوحدة، مع ما يحذّر منه المترجم، وما يوقفه الكاشف، وما لا ينبّه إليه أحد؛ ويعيد في تقييم الخروج مهارات تقييم الدخول؛ ويختتم بستة تحدّيات تجمع الوحدة كلها.
أهداف التعلم
- تفكيك مسألة إلى دوال، لكلٍّ منها واجهتها وعقدها (الشرط المسبق والشرط اللاحق)، واختبار كلٍّ منها على حدة.
- اختيار طريقة تمرير كل وسيط وطريقة إعادة النتائج، وتعليل الاختيار.
- حلّ مسألة بالاستدعاء الذاتي وإثبات صحته بالاستقراء وتوقّفه بمقياس متناقص، مع تقدير كلفته بعدد الاستدعاءات.
- التعرّف على السلوك غير المعرَّف في الوحدة (المسار الخالي من
return، والمرجع المعلَّق، والنتيجة التي تفيض، والمكدس المستنفد) وإعادة كتابة البرنامج من دونه. - الفصل، فيما تعلّمناه في الوحدة، بين ما يصحّ في أي لغة وما يخصّ C++.
ما حقّقته الوحدة
وضعت الوحدة لنفسها غاية أن تعلّم تفكيك المسألة إلى أجزاء ذات أسماء، لكلٍّ منها واجهة وعقد، وحلّ المسائل بالاستدعاء الذاتي. وقد تحقّقت الغاية بالاستناد فقط إلى ما أعلنت المقدمة أنه معلوم: حلقات الوحدة 4، بلامتغيرها ومتغايرها، ومواصفات الدرس 1.1، ونموذج الذاكرة في الوحدة 2. وبرنامج العددين المتحابين، الذي كانت حلقته المنسوخة تجمع قواسم العدد الخطأ، يُكتب الآن بدالة واحدة، تحقّقنا منها مرة واحدة مقابل عقدها.
الدوال
علّم درس الدوال التصريح بالدالة وتعريفها واستدعاءها، وميّز ثلاث لحظات: عند الترجمة يُفحص كل استدعاء مقابل تصريح سبقه؛ وعند الربط يُبحث عن التعريف؛ وعند التنفيذ تُحسب القيم الممرَّرة، ويُنشأ إطار في مكدس الاستدعاءات، وينتقل التحكم إلى الجسم. وبيّن أن بلوغ نهاية دالة ليست void من غير return سلوك غير معرَّف، واختتم بالعقد، أي الشرط المسبق والشرط اللاحق، الذي يوزّع المسؤوليات بين من يستدعي والدالة.
الوسائط ونطاق الرؤية
درس درس الوسائط ونطاق الرؤية الطرق التي تدخل منها البيانات وتخرج منها النتائج: الوسيط بالقيمة نسخة؛ والوسيط بالمرجع اسم ثانٍ لخانة من يستدعي؛ والمرجع الثابت يقرأ دون نسخ. ويلزم عن ذلك قاعدة الاختيار (القيمة للصغير، والمرجع الثابت للكبير الذي يُقرأ، والمرجع فقط إن كان التعديل هو الغاية)، وللنتائج المتعددة std::pair وstd::tuple مع الربط المهيكل. وميّز نطاق رؤية الاسم، وهو خاصية للنص، من مدة حياة المتغير، وهي خاصية للتنفيذ، وانتهى بالمرجع الذي يبقى بعد زوال خانته.
التصميم بالدوال
علّم درس التصميم بالدوال كيف نقرّر أيّ الدوال نكتب، بالتنقيح التدريجي: main قصيرة تستدعي دوال مصرَّحًا بها فقط، ثم النزول إلى كل واحدة منها، بحيث يُرسم التفكيك شجرةً. ووضع معايير الواجهة الجيدة، وقاعدة «دالة واحدة، مهمة واحدة» بعلاماتها (حرف العطف في الاسم، والدالة التي لا تتسع لها شاشة، والراية) وبالآثار الخفية، كالمتغير العام؛ وقدّم التحميل الزائد بترتيب أفضليته وبالاستدعاء الملتبس؛ وأعاد كتابة خوارزميات الوحدة 4 دوالَّ مختبَرة كلٌّ على حدة.
الاستدعاء الذاتي
علّم درس الاستدعاء الذاتي أن الدالة تستطيع أن تستدعي نفسها لتحلّ نسخة أصغر من المسألة. وأثبت الصحة بالاستقراء، بافتراض صحة الاستدعاء الأصغر، والتوقّف بمقياس طبيعي متناقص؛ وتتبّع في المكدس الأطر التي تتراكم ثم تُزال، وبيّن كيف ينفد؛ ونبّه إلى أن نوع النتيجة يفيض قبل المكدس بكثير؛ وقارن فيبوناتشي التراجعي بالتكراري: استدعاءً مقابل 29 عملية جمع لحساب .
جارٍ تحميل المحتوى…