مؤشر غير شفاف
في برمجة الكمبيوتر ، المؤشر غير الشفاف هو حالة خاصة من نوع البيانات غير الشفاف ، وهو نوع بيانات تم إعلانه كمؤشر إلى سجل أو بنية بيانات من نوع غير محدد.
توجد المؤشرات المعتمة في العديد من لغات البرمجة بما في ذلك Ada و C و C++ و D و Modula-2 .
إذا كانت اللغة ذات نوع قوي ، فإن البرامج والإجراءات التي لا تحتوي على أي معلومات أخرى حول نوع المؤشر غير الشفاف T لا تزال قادرة على إعلان المتغيرات والمصفوفات وحقول التسجيل من النوع T ، وتعيين قيم من هذا النوع، ومقارنة هذه القيم للمساواة. ومع ذلك، لن يتمكنوا من إلغاء مرجع مثل هذا المؤشر، ويمكنهم فقط تغيير محتوى الكائن عن طريق استدعاء بعض الإجراءات التي تحتوي على المعلومات المفقودة.
المؤشرات المعتمة هي طريقة لإخفاء تفاصيل تنفيذ واجهة ما عن العملاء العاديين، بحيث يمكن تغيير التنفيذ دون الحاجة إلى إعادة تجميع الوحدات النمطية التي تستخدمها. وهذا يفيد المبرمج أيضًا حيث يمكن إنشاء واجهة بسيطة، ويمكن إخفاء معظم التفاصيل في ملف آخر. [1] وهذا مهم لتوفير توافق الكود الثنائي من خلال إصدارات مختلفة من مكتبة مشتركة ، على سبيل المثال.
تم وصف هذه التقنية في أنماط التصميم باسم نمط الجسر . ويشار إليها أحيانًا باسم " فئات المقبض "، [2] أو " مصطلح Pimpl " (لمصطلح "مؤشر إلى مصطلح التنفيذ")، [3] أو " مصطلح جدار حماية المترجم "، [4] أو " مؤشر d" أو " قط شيشاير "، وخاصة بين مجتمع C++. [2]
أمثلة
آدا
الحزمة Library_Interface هي
نوع المقبض محدود خاص ؛
-- العمليات...
النوع الخاص Hidden_Implementation ؛ -- المحدد في جسم الحزمة هو
Handle وهو access Hidden_Implementation ؛ النهاية Library_Interface ؛
النوع Handleعبارة عن مؤشر غير شفاف إلى التنفيذ الحقيقي، وهو غير محدد في المواصفات. لاحظ أن النوع ليس خاصًا فحسب (لمنع العملاء من الوصول إلى النوع بشكل مباشر، ومن خلال العمليات فقط)، بل إنه محدود أيضًا (لتجنب نسخ بنية البيانات، وبالتالي منع المراجع المعلقة).
حزمة نص المكتبة_الواجهة هي
نوع Hidden_Implementation هو سجل
... -- التنفيذ الفعلي يمكن أن يكون أي شيء
نهاية السجل ؛
- تعريف العمليات...
نهاية واجهة المكتبة ؛
تُسمى هذه الأنواع أحيانًا " أنواع تافت " - نسبةً إلى تاكر تافت، المصمم الرئيسي لـ Ada 95 - لأنها تم تقديمها في ما يسمى بتعديل تافت لـ Ada 83. [5]
ج
/* كائن.ح */
هيكل الكائن ؛
/
* * يعتبر المترجم أن struct obj نوع غير مكتمل.
يمكن استخدام الأنواع غير المكتملة في الإعلانات.
*/
حجم_t obj_size ( void )؛
void obj_setid ( struct obj * , int );
int obj_getid ( هيكل obj * );
/* كائن.ج */
#تضمين "obj.h"
هيكل الكائن { int id ؛ };
/*
* سوف يقوم المتصل بالتعامل مع التخصيص.
* قم بتوفير المعلومات المطلوبة فقط
*/
size_t obj_size ( void ) { إرجاع sizeof ( struct obj ); }
void obj_setid ( struct obj * o , int i ) { o -> id = i ; }
int obj_getid ( struct obj * o ) { return o -> id ; }
يوضح هذا المثال طريقة لتحقيق جانب إخفاء المعلومات ( التغليف ) في البرمجة الموجهة للكائنات باستخدام لغة C. إذا أراد شخص ما تغيير تعريف struct obj، فلن يكون من الضروري إعادة تجميع أي وحدات أخرى في البرنامج تستخدم obj.hملف الرأس ما لم يتم تغيير واجهة برمجة التطبيقات أيضًا. لاحظ أنه قد يكون من المرغوب فيه أن تتحقق الوظائف من أن المؤشر المرسل ليس NULL، ولكن تم حذف مثل هذه الفحوصات أعلاه للاختصار.
سي++
/*الفئة العامة.h */
#تضمين <الذاكرة>
class PublicClass { public : PublicClass (); // Constructor PublicClass ( const PublicClass & ); // نسخ المنشئ PublicClass ( PublicClass && ); // نقل المنشئ PublicClass & operator = ( const PublicClass & ); // نسخ عامل التعيين PublicClass & operator = ( PublicClass && ); // نقل عامل التعيين ~ PublicClass (); // Destructor
//عمليات أخرى...
private :
struct CheshireCat ; // غير معرف هنا std :: unique_ptr < CheshireCat > d_ptr_ ; // مؤشر غير شفاف };
/*الفئة العامة.cpp */
#تضمين "PublicClass.h"
هيكل PublicClass :: CheshireCat { int a ; int b ; };
PublicClass :: PublicClass ()
: d_ptr_ ( std :: make_unique < CheshireCat > ()) { // لا تفعل شيئا. }
PublicClass :: PublicClass ( const PublicClass & other ) : d_ptr_ ( std :: make_unique < CheshireCat > ( * other . d_ptr_ )) { // لا تفعل شيئا. }
PublicClass :: PublicClass ( PublicClass && other ) = default ؛
PublicClass & PublicClass :: عامل = ( const PublicClass & other ) { * d_ptr_ = * other . d_ptr_ ; إرجاع * هذا ; }
PublicClass & PublicClass :: المشغل = ( PublicClass && ) = الافتراضي ؛
PublicClass ::~ PublicClass () = default ؛
نمط مؤشر d هو أحد تطبيقات المؤشر المعتم . وهو يستخدم بشكل شائع في فئات C++ نظرًا لمزاياه (المذكورة أدناه). مؤشر d هو عضو بيانات خاص للفئة يشير إلى مثيل لهيكل. تسمح هذه الطريقة لإعلانات الفئة بحذف أعضاء البيانات الخاصة، باستثناء مؤشر d نفسه. [6] ونتيجة لذلك،
- مزيد من تنفيذ الفصل مخفي
- إضافة أعضاء بيانات جدد إلى الهيكل الخاص لا يؤثر على التوافق الثنائي
- يجب أن يتضمن ملف الرأس الذي يحتوي على إعلان الفئة فقط تلك الملفات المطلوبة لواجهة الفئة، وليس لتنفيذها.
من الفوائد الجانبية أن التجميعات تكون أسرع لأن ملف الرأس يتغير بشكل أقل تكرارًا. لاحظ أن العيب المحتمل لنمط مؤشر d هو الوصول غير المباشر للأعضاء من خلال المؤشر (على سبيل المثال، المؤشر إلى الكائن في التخزين الديناميكي)، والذي يكون أبطأ أحيانًا من الوصول إلى عضو عادي غير مؤشر. يتم استخدام مؤشر d بشكل كبير في مكتبات Qt [7] و KDE .
انظر أيضا
مراجع
- ^ كريس ماكيلوب. "أدوات البرمجة - المؤشرات المعتمة". أنظمة برمجيات QNX . تم الاسترجاع في 2019-01-16 .
- ^ من تأليف بروس إيكل (2000). "الفصل الخامس: إخفاء التنفيذ". التفكير بلغة سي++، المجلد الأول: مقدمة إلى سي++ القياسية (الطبعة الثانية). برنتيس هول. رقم ISBN 0-13-979809-9.
- ^ فلاديمير باتوف (2008-01-25). “جعل البيمبل سهلاً”. مجلة الدكتور دوب . تم الاسترجاع 2008-05-07 .
- ^ هيرب سوتر. متعة البثور (أو المزيد عن مصطلح جدار الحماية للمترجم)
- ^ روبرت أ. داف (2002-07-29). "رد: ما هو اسمه مرة أخرى؟". مجموعة الأخبار : comp.lang.ada . تم الاسترجاع في 2007-10-11 .
- ^ استخدام مؤشر d — لماذا وكيف ينفذ KDE المؤشرات المعتمة
- ^ "D-Pointer". ويكي كيو تي . تم الاسترجاع في 23 ديسمبر 2016 .
روابط خارجية
- عبارة البثور
- جدران الحماية التجميعية أو جدران الحماية التجميعية
- عبارة "حب الشباب السريع"
- مؤشرات D — قاعدة بيانات KDE التقنية
- عندما تقوم بـ "XOR للمؤشر برقم عشوائي"[1][2]، تكون النتيجة مؤشرًا "غير شفاف حقًا" [3].
- جعل البثور سهلة، فلاديمير باتوف
