التفويض (البرمجة الموجهة للكائنات)
في البرمجة كائنية التوجه ، يشير التفويض إلى تقييم عضو ( خاصية أو دالة ) لكائن ( المستقبل) في سياق كائن أصلي آخر (المرسل). يمكن إجراء التفويض بشكل صريح، عن طريق نقل مسؤوليات الكائن المرسل إلى الكائن المستقبل، وهو أمر ممكن في أي لغة كائنية التوجه ؛ أو بشكل ضمني، من خلال قواعد البحث عن الأعضاء في اللغة، الأمر الذي يتطلب دعم اللغة لهذه الميزة. يُعد التفويض الضمني الطريقة الأساسية لإعادة استخدام السلوك في البرمجة القائمة على النماذج الأولية ، وهو ما يُقابل الوراثة في البرمجة القائمة على الأصناف . من أشهر اللغات التي تدعم التفويض على مستوى اللغة لغة Self ، التي تُدمج مفهوم التفويض من خلال مفهوم خانات الأصل القابلة للتغيير والتي تُستخدم عند البحث عن الدوال في استدعاءات self، ولغة JavaScript ؛ انظر تفويض JavaScript .
يُستخدم مصطلح التفويض أيضًا بشكل فضفاض للإشارة إلى علاقات أخرى متنوعة بين الكائنات؛ انظر التفويض (البرمجة) لمزيد من المعلومات. من المفاهيم التي غالبًا ما تُسبب التباسًا: استخدام كائن آخر، والذي يُشار إليه بدقة أكبر بالتشاور أو التجميع ؛ وتقييم عنصر في كائن ما من خلال تقييم العنصر المقابل في كائن آخر، لا سيما في سياق الكائن المُستقبِل، والذي يُشار إليه بدقة أكبر بالتوجيه (عندما لا يُمرر كائن الغلاف نفسه إلى الكائن المُغلَّف). [ 1 ] [ 2 ] [ أ ] نمط التفويض هو نمط تصميم برمجي لتنفيذ التفويض، على الرغم من أن هذا المصطلح يُستخدم أيضًا بشكل فضفاض للإشارة إلى التشاور أو التوجيه.
ملخص
تم تعريف هذا الشعور بالتفويض كميزة في لغة البرمجة تستخدم قواعد البحث عن الأساليب لإرسال ما يسمى بالاستدعاءات الذاتية بواسطة ليبرمان في ورقته البحثية لعام 1986 بعنوان "استخدام الكائنات النموذجية لتنفيذ السلوك المشترك في الأنظمة الموجهة للكائنات".
يعتمد التفويض على الربط الديناميكي ، إذ يتطلب أن يكون استدعاء دالة معينة قادرًا على استدعاء أجزاء مختلفة من التعليمات البرمجية أثناء التشغيل . يُستخدم التفويض في جميع أنحاء نظام macOS (وسابقه NeXTStep ) كوسيلة لتخصيص سلوك مكونات البرنامج. [ 3 ] يُمكّن هذا من استخدام فئة واحدة يوفرها نظام التشغيل لإدارة النوافذ، لأن هذه الفئة تأخذ مفوضًا خاصًا بالبرنامج، ويمكنه تجاوز السلوك الافتراضي حسب الحاجة. على سبيل المثال، عندما ينقر المستخدم على زر الإغلاق، يُرسل مدير النوافذ استدعاء windowShouldClose: إلى المفوض، ويمكن للمفوض تأخير إغلاق النافذة إذا كانت هناك بيانات غير محفوظة في محتوياتها.
يمكن وصف التفويض (وتمييزه عن إعادة التوجيه ) بأنه ربط متأخر للذات : [ 4 ]
... الرسائل المرسلة إلى المتغير
self(أوthis) في الأصل "ستعود" إلى الكائن الذي تلقى الرسالة في الأصل.
أي أن selfتعريف الطريقة في الكائن المستقبل لا يرتبط بشكل ثابت بهذا الكائن في وقت التعريف (مثل وقت الترجمة أو عندما يتم إرفاق الدالة بكائن)، ولكن في وقت التقييم ، يرتبط بالكائن الأصلي .
لقد طُرحت فكرة أن التفويض قد يُفضّل في بعض الحالات على الوراثة لجعل شفرة البرنامج أكثر قابلية للقراءة والفهم. [ 5 ] على الرغم من أن التفويض الصريح شائع إلى حد ما، إلا أن عددًا قليلًا نسبيًا من لغات البرمجة الرئيسية يُطبّق التفويض كنموذج بديل للوراثة. العلاقة الدقيقة بين التفويض والوراثة معقدة؛ إذ يعتبرهما بعض المؤلفين متكافئين، أو أحدهما حالة خاصة من الآخر. [ 6 ]
الدعم اللغوي للتفويض
في اللغات التي تدعم التفويض عبر قواعد البحث عن الدوال، يُعرَّف إرسال الدوال بنفس طريقة تعريف الدوال الافتراضية في الوراثة: حيث تُختار دائمًا الدالة الأكثر تحديدًا أثناء البحث عن الدوال. وبالتالي، فإن الكيان المُستقبِل الأصلي هو بداية البحث عن الدوال حتى وإن كان قد نقل التحكم إلى كائن آخر (عبر رابط تفويض، وليس مرجع كائن).
تتميز عملية التفويض بإمكانية تنفيذها أثناء التشغيل، وتأثيرها على مجموعة فرعية فقط من الكيانات من نوع معين، بل ويمكن إزالتها أثناء التشغيل أيضًا. في المقابل، تستهدف الوراثة عادةً النوع نفسه وليس الكائنات، وتقتصر على وقت الترجمة. من ناحية أخرى، يمكن التحقق من نوع الوراثة بشكل ثابت، بينما لا يمكن التحقق من نوع التفويض عمومًا بدون استخدام الأنواع العامة (مع أن نسخة محدودة من التفويض يمكن أن تكون آمنة من حيث النوع [ 7 ] ). يمكن تسمية التفويض بـ "الوراثة أثناء التشغيل لكائنات محددة".
إليك مثال على الشفرة الزائفة بلغة تشبه لغة C# / Java :
class A { void foo () { // "this" تُعرف أيضًا بالأسماء "current" و"me" و"self" في لغات أخرى this . bar (); }void bar () { print ( "a.bar" ); } }class B { private delegate A a ; // رابط التفويضpublic B ( A a ) { this . a = a ; }void foo () { a . foo (); // استدعاء foo() على نسخة a }void bar () { print ( "b.bar" ); } }a = new A (); b = new B ( a ); // إنشاء تفويض بين كائنينb.foo()سيؤدي استدعاء الدالة إلى طباعة b.barthis ، لأنها تشير إلى الكائن المرسل الأصليb ، ضمن سياق . ويُشار إلى aالغموض الناتج عن ذلك باسم انفصام الكائن .this
عند ترجمة الضمني thisإلى معلمة صريحة، يتم ترجمة الاستدعاء (في B، مع aمفوض) a.foo()إلى A.foo(b)، باستخدام نوع aلحل الأسلوب، ولكن كائن التفويض bللوسيط this.
باستخدام الوراثة، يكون الكود المماثل (باستخدام الأحرف الكبيرة للتأكيد على أن الحل يعتمد على الفئات وليس الكائنات) كما يلي:
class A { void foo () { this . bar (); }void bar () { print ( "A.bar" ); } }class B extends A { public B () {}void foo () { super . foo (); // استدعاء الدالة foo() من الفئة الأصلية (A) }void bar () { print ( "B.bar" ); } }b = new B ();b.foo()سيؤدي الاستدعاء إلى B.bar . في هذه الحالة، thisيكون الأمر واضحًا لا لبس فيه: يوجد كائن واحد، b، ويتم this.bar()حله إلى الطريقة الموجودة في الفئة الفرعية.
لا تدعم لغات البرمجة بشكل عام هذا الشكل غير المعتاد من التفويض كمفهوم لغوي، ولكن هناك بعض الاستثناءات .
الميراث المزدوج
إذا كانت اللغة تدعم كلاً من التفويض والوراثة، فيمكن للمرء القيام بالوراثة المزدوجة باستخدام الآليتين في نفس الوقت كما في
class C extends A { delegatelink D d ; }وهذا يستدعي وضع قواعد إضافية للبحث عن الطرق، حيث يوجد الآن طريقتان محتملتان يمكن الإشارة إليهما على أنهما الأكثر تحديدًا (بسبب مساري البحث).
المجالات ذات الصلة
يمكن وصف التفويض بأنه آلية منخفضة المستوى لمشاركة التعليمات البرمجية والبيانات بين الكيانات. وبذلك، يُشكل أساسًا لبُنى لغوية أخرى. ومن الجدير بالذكر أن لغات البرمجة الموجهة نحو الأدوار تستخدم التفويض، ولكن اللغات القديمة منها على وجه الخصوص كانت تستخدم التجميع فعليًا مع ادعائها استخدام التفويض. ولا ينبغي اعتبار هذا غشًا، بل مجرد تعريفات متعددة لما يعنيه التفويض (كما هو موضح أعلاه).
في الآونة الأخيرة، تم أيضًا العمل على توزيع التفويض، بحيث يمكن لعملاء محرك البحث (الذي يبحث عن غرف فندقية رخيصة) استخدام كيان مشترك باستخدام التفويض لمشاركة أفضل النتائج والوظائف العامة القابلة لإعادة الاستخدام.
وقد اقترح إرنست ولورنز في عام 2003 استخدام التفويض لحل المشكلات المتعلقة بالنصائح في البرمجة الموجهة نحو الجوانب .
انظر أيضاً
- نمط التفويض
- نمط المحول
- الإغراء
- استمرار
- وراثة التنفيذ
- دلالات الوراثة
- الفصام (البرمجة الموجهة للكائنات)
- الميراث الافتراضي
- دالة التغليف
يميز:
ملحوظات
- ↑ يستخدم بيك 1997 مصطلحي "التفويض البسيط" عندما لا يكون للكائن المتلقي حق الوصول إلى الكائن المرسل، و"التفويض الذاتي" عندما يكون للكائن المتلقي حق الوصول إلى الكائن المرسل؛ في اللغة الحديثة، هذه هي "إعادة التوجيه" و"التفويض"، كما هو مستخدم في هذه المقالة.
مراجع
- ↑ جاما وآخرون 1995 ، "التفويض"، ص 20-21.
- ↑ بيك 1997 ، "التفويض"، ص 64-69.
- ↑ أبل (20 أغسطس 2009). "دليل أساسيات كوكوا: المندوبون ومصادر البيانات" . اتصال مطوري أبل . تم الاسترجاع في 11 سبتمبر 2009 .
- ↑ "الفئات المتقاطعة والنماذج الأولية". منظورات معلوماتية النظم: المؤتمر التذكاري الدولي الخامس لأندريه إرشوف، PSI 2003، أكاديمغورودوك، نوفوسيبيرسك، روسيا، 9-12 يوليو 2003، أوراق منقحة . ص 38 .
- ↑تريغف رينسكاوغ ، قسم المعلوماتية، جامعة أوسلو، "حالة الكود القابل للقراءة" (2007)
- ↑ شتاين، لين أندريا. التفويض هو الإرث . وقائع مؤتمر OOPSLA '87 حول أنظمة ولغات وتطبيقات البرمجة الكائنية التوجه. الصفحات 138-146 . doi : 10.1145/38807.38820 .
- ↑ غونتر كنيزل (1999-11-19). "التفويض الآمن للأنواع لتكييف المكونات أثناء التشغيل" . ECOOP' 99 - البرمجة كائنية التوجه . سلسلة محاضرات في علوم الحاسوب. المجلد 1628. سبرينغر. الصفحات 351-366 . CiteSeerX 10.1.1.33.7584 . doi : 10.1007/3-540-48743-3_16 . ISBN 978-3-540-66156-6أُرشف من الأصل بتاريخ 4 مارس 2015. تم الاطلاع عليه بتاريخ 4 مارس 2015.
تقترح هذه الورقة البحثية التوريث القائم على الكائنات (المعروف أيضًا بالتفويض) كمكمل لتكوين الكائنات القائم على التوجيه فقط. وتعرض تكاملًا آمنًا من حيث النوع للتفويض في نموذج كائنات قائم على الفئات، وتوضح كيف يتغلب على المشكلات التي تواجه تفاعل المكونات القائم على التوجيه، وكيف يدعم قابلية توسيع المكونات بشكل مستقل، والتكيف الديناميكي غير المتوقع للمكونات.
{{cite book}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط )
- ليبرمان، هنري (1986). "استخدام الكائنات النموذجية لتنفيذ السلوك المشترك في الأنظمة الموجهة للكائنات" . وقائع مؤتمر أنظمة ولغات وتطبيقات البرمجة الموجهة للكائنات . المجلد 21. بورتلاند. الصفحات 214-223 . CiteSeerX 10.1.1.48.69 . doi : 10.1145/960112.28718 .
{{cite book}}تم|journal=تجاهله ( مساعدة ) صيانة CS1: موقع الناشر مفقود ( رابط ) - لين أندريا شتاين، هنري ليبرمان، ديفيد أونغار: رؤية مشتركة للمشاركة: معاهدة أورلاندو . في: وون كيم، فريدريك هـ. لوخوفسكي (محرران): مفاهيم البرمجة الكائنية، قواعد البيانات، والتطبيقات. مطبعة ACM، نيويورك 1989، الفصل 3، الصفحات 31-48 . ISBN 0-201-14410-7(متوفر على الإنترنت في Citeseer )
- جاما، إريك ؛ هيلم، ريتشارد ؛ جونسون، رالف ؛ فليسيدس، جون (1995). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون-ويسلي . ISBN 978-0-201-63361-0.
- مالينفانت، ج.: حول التنوع الدلالي للغات البرمجة القائمة على التفويض، وقائع مؤتمر OOPSLA95، نيويورك: ACM 1995، ص 215-230.
- بيك، كينت (1997). أنماط أفضل الممارسات في لغة سمول توك . برنتيس هول. ISBN 978-0134769042.
- كاسبر بيلستيد غرافيرسن: طبيعة الأدوار - تحليل تصنيفي للأدوار كبنية لغوية. أطروحة دكتوراه، 2006، (متاحة عبر الإنترنت في جامعة كوبنهاغن لتكنولوجيا المعلومات )
روابط خارجية
- طريقة جديدة لتطبيق المندوب في لغة C++
- المندوبون السريعون في لغة C++
- مشروع PerfectJPattern مفتوح المصدر ، يوفر تطبيقًا قابلاً لإعادة الاستخدام للمفوضين في جافا
- البرمجة الكائنية التوجه
- البرمجة القائمة على النماذج الأولية
