سؤال

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

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

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

شكرًا.

هل كانت مفيدة؟

المحلول

أعتقد أنه لا توجد إجابة واحدة لجميع اللغات الديناميكية. في Python ، على سبيل المثال ، لا توجد واجهات ، ولكن هناك ميراث متعدد. لا يزال استخدام فئات تشبه الواجهة مفيدًا:

  • يمكن أن توفر الفئات الشبيهة بالواجهة التنفيذ الافتراضي للطرق ؛
  • بطب البطة جيد ، ولكن إلى حد ما ؛ في بعض الأحيان يكون من المفيد أن تكون قادرًا على الكتابة isinstance(x, SomeType), ، خاصة عندما SomeType يحتوي على عديدة طُرق.

نصائح أخرى

تعتبر الواجهات في اللغات الديناميكية مفيدة كتوثيق لواجهة برمجة التطبيقات التي يمكن فحصها تلقائيًا أو على سبيل المثال عن طريق أدوات التطوير أو التأثيرات في وقت التشغيل.

كمثال، Zope.Interface هو المعيار الفعلي للواجهات في بيثون. تجد مشاريع مثل Zope و Twisted التي تعرض واجهات برمجة التطبيقات الضخمة للاستهلاك أنها مفيدة ، ولكن بقدر ما أعرف أنها لا تستخدم كثيرًا خارج هذا النوع من المشاريع.

في روبي، وهي لغة مكتوبة ديناميكيًا وتسمح فقط بالوراثة الفردية، يمكنك محاكاة "واجهة" عبر mixins، بدلاً من تلويث الفصل بطرق "الواجهة".

تحاكي Mixins الوراثة المتعددة جزئيًا، مما يسمح للكائن "بالوراثة" من مصادر متعددة، ولكن دون الغموض والتعقيد الناتج عن وجود آباء متعددين.لا يوجد سوى والد حقيقي واحد.

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

مثال مبسط جدا:

module Equippable
  def weapon
    "broadsword"
  end
end


class Hero
  include Equippable

  def hero_method_1
  end

  def hero_method_2
  end
end


class Mount
  include Equippable

  def mount_method_1
  end
end


h = Hero.new
h.weapon    # outputs "broadsword"


m = Mount.new
m.weapon    # outputs "broadsword"

Equippable هي واجهة Hero وMount وأي فئة أو طراز آخر يتضمنها.

(من الواضح أنه من المرجح أن يتم ضبط السلاح ديناميكيًا بواسطة مُهيئ، والذي تم تبسيطه في هذا المثال.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top