مرجع
آخر الزيارات

تنويع البط

495 كلمة•0 مشاهدة•🗒️ منذ يوم
باختصار: تنويع البط في برمجة الحاسوب هي تطبيق لاختبار البط — «إذا كانت تمشي مثل البطة وتبطبط مثل البطة، فيجب أن تكون بطة» — لتحديد إمكانية استخدام كائن لغرض معين. تتناول المقالة 6 أقسام، منها «أنظمة النوع الهيكلي»، «في اللغات المكتوبة بشكل ثابت» و«مثال».
المحتويات
  1. أنظمة النوع الهيكلي
  2. في اللغات المكتوبة بشكل ثابت
  3. مثال
  4. قوالب أو أنواع عامة
  5. animal.fly
  6. البروتوكولات والواجهات

في البداية، تنويع البط في برمجة الحاسوب هي تطبيق لاختبار البط — «إذا كانت تمشي مثل البطة وتبطبط مثل البطة، فيجب أن تكون بطة» — لتحديد إمكانية استخدام كائن لغرض معين. بالتنويع العادي، يتم تحديد الملاءمة حسب نوع الكائن. في تنويع البط، يتم تحديد ملاءمة الكائن من خلال وجود طرق وخصائص معينة، بدلاً من نوع الكائن نفسه. ونتناول فيما يلي مزيدًا من التفاصيل.

أنظمة النوع الهيكلي

وفي هذا الصدد، تدعم لغات تايب سكريب و لغة كامل الكائنية وسكالا وغو و Elm و Gosu و PureScript التنويع الهيكلي بدرجات متفاوتة.

إضافةً إلى ذلك، تنويع البط يشبه التنويع الهيكلي، لكنه متميز عنه. التنويع الهيكلي هي نظام التنويع الثابت يحدد توافق النوع ومعادلته من خلال بنية النوع، في حين أن تنويع البط ديناميكي ويحدد توافق النوع من خلال جزء هيكل النوع ذلك فقط؛ والذي يتم الوصول إليه أثناء وقت التشغيل.

في اللغات المكتوبة بشكل ثابت

مقارنة مع أنظمة الأنواع الأخرى

وعلى صعيد آخر، تحتوي بعض اللغات ذات التنويع الثابت في الغالب مثل سي شارب وبوو على ميزات ترشد المجمّع لترتيب التحقق من نوع الأصناف في وقت التشغيل بدلاً من وقت التجميع، وتضمين كود التحقق من النوع في وقت التشغيل وذلك في الناتج المجمّع. يمكننا كذلك تنفيذ تويع البط في جافا باستخدام أدوات معالجة الطرق البرمجية MethodHandle API.

مثال

ومن ناحية أخرى، هذا مثال بسيط في بايثون 3 يوضح كيف يمكن استخدام أي كائن في أي سياق، حتى يتم استخدامه بطريقة لا يدعمها. class Duck:

  • def fly(self):
  • print("Duck flying")
  • class Sparrow:
  • def fly(self):
  • print("Sparrow flying")
  • class Whale:
  • def swim(self):
  • print("Whale swimming")
  • for animal in Duck, Sparrow, Whale:

قوالب أو أنواع عامة

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

كذلك، دوال أو طرق القالب، أو الدوال والطرق العامة تُطبق اختبار البط في تنويع ثابت السياق؛ هذا يجلب بشكل عام كل مزايا وعيوب التحقق من النوع الثابت مقابل الديناميكي. يمكن أن يكون تنويع البط أكثر مرونة كذلك من حيث أنه يجب فقط تنفيذ الطرق البرمجية التي تم استدعاؤها بالفعل في وقت التشغيل، بينما تتطلب القوالب تنفيذ جميع الطرق التي لا يمكن إثبات أنه لا يمكن الوصول إليها في وقت التجميع.

animal.fly

  • Output:
  • Duck flying
  • Sparrow flying
  • AttributeError: 'Whale' object has no attribute 'fly'

البروتوكولات والواجهات

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

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.