إخفاء التنفيذ باستخدام PIMPL
أخفِ تفاصيل التنفيذ خلف نمط المؤشر إلى التنفيذ.
إخفاء التنفيذ باستخدام PIMPL درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
نمط PIMPL
PIMPL = "Pointer to IMPLementation" (مؤشر إلى التنفيذ). انقل البيانات الخاصة بالفئة إلى بنية impl منفصلة، ويمكن الوصول إليها عبر مؤشر.
لماذا PIMPL؟
الفوائد:
- إخفاء تفاصيل التنفيذ عن الترويسات
- تقليل تبعيات وقت الترجمة
- الحفاظ على استقرار ABI عند إضافة أعضاء خاصة
- إتاحة تبديل عمليات التنفيذ
البنية الأساسية
تحتفظ الفئة العامة بمؤشر إلى بنية Impl المعرّفة في ملف .cpp فقط.
// widget.h
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
struct Impl;
std::unique_ptr<Impl> pimpl_;
};Impl في ملف .cpp
تحتوي بنية Impl على جميع البيانات الفعلية.
// widget.cpp
struct Widget::Impl {
std::string name;
int counter;
// ... anything else, freely
};
Widget::Widget()
: pimpl_(std::make_unique<Impl>()) {}
Widget::~Widget() = default; // must be in .cpp where Impl is complete
void Widget::doSomething() {
pimpl_->counter++;
}المُخرّب في ملف cpp
يجب تعريف المُخرّب في ملف .cpp حيث تكون Impl مكتملة. وإلا فلن يتمكن unique_ptr من حذف نوع غير مكتمل.
دوال الأعضاء الخاصة
يجب أيضًا التصريح صراحةً بالنسخ والنقل والإسناد عند الحاجة. فلا يمكن للنسخ التي ينشئها المترجم أن تعمل مع نوع غير مكتمل في الترويسة.
// widget.h
class Widget {
public:
Widget(const Widget& other);
Widget& operator=(const Widget& other);
Widget(Widget&&) noexcept;
Widget& operator=(Widget&&) noexcept;
~Widget();
};تكلفة الأداء
يضيف PIMPL مستوى من الإسناد غير المباشر عند كل وصول إلى عضو، بالإضافة إلى تخصيص على الكومة. وقد يؤثر ذلك في الدوال التي يُستدعى بها كثيرًا — لذا احرص على القياس للتأكد.
عمليات بناء أسرع
يمكن الآن أن تكون الترويسات التي كانت تتضمن أنواع std أو تبعيات مكلفة خفيفة. عدّل ملف .cpp من دون إعادة ترجمة المستهلكين.
PIMPL مع التوريث
يمكن دمجه مع التوريث، لكنه يزيد التعقيد. ولا ترث الفئة العامة عادةً من أي شيء، بينما يمكن لبنية Impl استخدام التوريث بحرية.
التنويعات
بدائل وتحسينات:
- Fast PIMPL — تخزين مضمن مع placement new
- Stable address — تبقى Impl مخصصة طوال عمر الكائن
- Type erasure — يمكن أن تكون Impl متعددة الأشكال
الاستخدام في العالم الحقيقي
يُستخدم PIMPL على نطاق واسع في:
- Qt (كل أداة فيه تستخدم PIMPL)
- العديد من المكتبات المملوكة
- Boost (في بعض المواضع)
متى تستخدمه
استخدم PIMPL عندما:
- تريد استقرار ABI عبر الإصدارات
- تتضمن ترويساتك تبعيات كثيرة بشكل غير مباشر
- تكشف عن واجهة API لمكتبة عامة
متى تتجنبه
تجنب PIMPL عندما:
- تكون الفئة داخلية — فلا يعتمد أي مستهلك على الترويسة
- تكون تكلفة الأداء أهم من أوقات البناء
- تكون الفئة صغيرة أو نادرًا ما تُعدّل
تحقق سريع
لماذا يجب تعريف مُخرّب فئة PIMPL في ملف .cpp؟
مراجعة
يخفي PIMPL التنفيذ بنقل البيانات الخاصة إلى بنية Impl يتم الوصول إليها عبر unique_ptr. وهو يحسن استقرار ABI وأوقات البناء، على حساب الإسناد غير المباشر. عرّف الأعضاء الخاصة في ملف .cpp حيث تكون Impl مكتملة.
الأسئلة الشائعة
هل درس «إخفاء التنفيذ باستخدام PIMPL» مجاني؟
نعم — نص درس «إخفاء التنفيذ باستخدام PIMPL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «إخفاء التنفيذ باستخدام PIMPL»؟
أخفِ تفاصيل التنفيذ خلف نمط المؤشر إلى التنفيذ. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «إخفاء التنفيذ باستخدام PIMPL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المكتبات المقتصرة على الترويسات مقابل المكتبات المترجمة
- إصدار API واستقرار ABI
- إخفاء التنفيذ باستخدام PIMPL
- كتابة مكتبة أدوات حديثة مقتصرة على الترويسات