قاعدة الثلاثة (برمجة سي++)

**قاعدة الثلاثة (rule of three)** **وقاعدة الخمسة (rule of five)** هما قاعدتان إرشاديتان في لغة سي++ تهدف إلى بناء كود آمن من الاستثناءات (exception-safe code) و وضع قواعد رسمية لإدارة الموارد . تحدد هذه القواعد كيفية استخدام الأعضاء الافتراضيين للصنف لتحقيق هذه الأهداف بشكل منهجي.

## قاعدة الثلاثة
قاعدة الثلاثة (المعروفة أيضًا باسم *قانون الثلاثة الكبار* أو *الثلاثة الكبار* ) هي قاعدة إرشادية في لغة سي++ (قبل سي++11 ) التي تنص على أنه إذا كان الصنف يحدد أيًا من العناصر التالية، فيجب عليها على الأرجح تعريف الثلاثة صراحةً: 

* مدمر
* منشئ النسخ
* عامل تعيين النسخ

* **المدمر (destructor)** – استدعاء المدمرين لجميع أعضاء نوع فئة الكائن
* **دالة النسخ (copy constructor)** – تقوم بإنشاء نسخة من كائن عن طريق نسخ جميع الأعضاء الخاصة بالكائن الأصلي إلى الكائن الجديد. يتم ذلك عبر استدعاء دوال النسخ للأعضاء التي تكون من نوع فئات (class-type) في الكائن، بالإضافة إلى إجراء تعيين مباشر (plain assignment) لجميع الأعضاء التي ليست من نوع فئات (مثل المتغيرات من النوع `int` أو المؤشرات).
* **عامل نسخ التعيين (copy assignment operator)** - يقوم بتعيين جميع أعضاء الكائن من الأعضاء المقابلة في الكائن الذي يتم تمريره كمعامل. يتم ذلك عن طريق استدعاء دوال النسخ للأنواع التي تكون من نوع فئات (class-type) لأعضاء الكائن، مع إجراء تعيين مباشر (plain assignment) لجميع الأعضاء التي ليست من نوع فئات، مثل المتغيرات من النوع `int` أو المؤشرات.

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

تعديل لهذه القاعدة هو أنه إذا كانت الفئة مصممة بحيث يتم استخدام مبدأ اكتساب الموارد هو التهيئة (Resource Acquisition Is Initialization - RAII) لجميع أعضائها (غير البسيطة)، فإنه يمكن ترك المدمّر (Destructor) غير معرّف (وهذا ما يعرف بـ "قانون الكبيرين" أو The Law of The Big Two) ). من الأمثلة لهذا النهج هو استخدام المؤشرات الذكية بدلاً من المؤشرات العادية. 

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

## قاعدة الخمسة
مع ظهور سي++11، يمكن توسيع قاعدة الثلاثة إلى *قاعدة الخمسة* (المعروفة أيضًا باسم "قاعدة الخمسة الكبار"  ) حيث تنفذ سي++11 *[[سي++11|دلالات النقل]]* ،  مما يسمح لكائنات الوجهة *بالاستيلاء على* (أو *سرقة* ) البيانات من الكائنات المؤقتة. يُظهر المثال التالي أيضًا أعضاء النقل الجديدة: مُنشئ النقل ومشغل تعيين النقل. وبالتالي، بالنسبة *لقاعدة الخمسة* لدينا *الأعضاء الخاصة* التالية:

* مدمر
* منشئ النسخ
* عامل تعيين النسخ
* نقل المنشئ
* عامل نقل المهمة

توجد مواقف قد تحتاج فيها الفئات إلى مدمرات، ولكنها لا تستطيع تنفيذ منشئي النسخ والنقل ومشغلي تعيين النسخ والنقل بشكل معقول. يحدث هذا، على سبيل المثال، عندما لا تدعم الفئة الأساسية هذه العناصر *الأربعة الكبرى* الأخيرة، ولكن منشئ الفئة المشتقة يخصص الذاكرة لاستخدامها الخاص.&#x5B; *[[ويكيبيديا:بحاجة لمصدر|<span title="This claim needs references to reliable sources. (October 2014)">بحاجة لمصدر</span>]]* &#x5D; في C++11، يمكن تبسيط ذلك من خلال تحديد الأعضاء الخمسة بشكل صريح كإعداد افتراضي. 

## انظر أيضا

* كائنات (سي++)
* صنف (برمجة الكمبيوتر)

## مراجع


تصنيف:سي++