Ruby / العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم / الدرس 10
تركيب الوحدات بعقد واضح للبحث عن الطرق
ميّز مساحات الأسماء و include و extend و prepend و super، وتجنب التعديل العام للأصناف وتغييرات العمر الخفية.
في هذه الصفحة
أهداف الدرس
- اشرح موضع الطرق المدمجة والمستقبل الذي يكتسبها.
- احفظ المعاملات والرد والرؤية والإخفاق عند تغليف السلوك.
قد تسمّي الوحدة شيفرة أو توفر سلوكا
قد توفر Module مساحة ثوابت وأصناف أو طرق مثيل للدمج أو عمليات على مستوى الوحدة. الأدوار مترابطة ولا تتبادل تلقائيا. تضيف include طرق الوحدة لسلسلة مثيلات الصنف، وتضيف extend السلوك للجانب المفرد لكائن معين. ولأن الصنف كائن، تؤدي extend عليه غالبا لطرق للصنف لا لمثيلاته المستقبلية. أظهر المستقبل عند المراجعة؛ ولا تعني إتاحة طريقة في مساحة اسم دمجها بكل صنف فيها.
اشترط القدرة التي يستخدمها المزيج فعلا
تستدعي Displayable الطريقة id على مستقبلها وتفترض معناها للعرض، وتوفر Record القارئ. لا تفرض Ruby الواجهة ساكنا؛ فقد يفشل تضمين الوحدة دون الطريقة عند display. وثّق الاعتماد وأبق المزيج متماسكا. تصعّب وحدة كبيرة تصل لمتغيرات داخلية غير مترابطة فهم الملكية. فضّل متعاونا صريحا لسلوك ذي عمر مورد أو إعداد أو تنفيذ قابل للاستبدال مستقل. لم يُنفّذ المخرج المتوقع التالي.
module Displayable
def display
"[#{id}]"
end
end
class Record
include Displayable
attr_reader :id
def initialize(id)
@id = id
end
end
puts Record.new('A-4').display
[A-4]
المخرج المتوقع [A-4]. يوفر السجل id وتوفر الوحدة display. لم يُنفذ مفسر أو فحص واجهة ديناميكية.
تغير prepend موضع العثور على السلوك المغلف
تضع prepend الوحدة قبل الصنف في سلسلة الأسلاف المعنية، فيستدعي الغلاف super للوصول لتنفيذ الصنف. لذلك تختلف آثار التجاوز عن include. تضيف الوحدات المتعددة والوراثة ترتيبا يُفحص ولا يُخمن من موضع الملفات وحده. يحفظ الغلاف عقد المعامل والرد والاستثناء. تمرر super بلا أقواس معاملات الاستدعاء الحالية، بينما لا تمرر super() شيئا؛ وقد يوضح التمرير الموضعي والمفتاحي الصريح الحد خاصة مع فصل Ruby 3.
أظهر نتيجة الغلاف
يعيد الغلاف أدناه نص عرض جديدا حول نتيجة الصنف، ولا يعدل المستقبل أو يبدأ خلفية أو يخفي استثناء. إذا أضيف رصد فأبق التعبير الأخير مقصودا حتى لا يعود سجل. يحتاج التطبيق المتكرر وتعارض الوحدات والموروث اختبارات في مكتبة فعلية. المثال شرح صغير للبحث على مستوى المصدر، لا دليل دمج خطاف إطار أو ترقيع إنتاج بأمان.
module WrappedLabel
def label
"wrapped:#{super}"
end
end
class Presenter
def label
'plain'
end
prepend WrappedLabel
end
puts Presenter.new.label
wrapped:plain
المخرج المتوقع wrapped:plain. يصل البحث للوحدة قبل Presenter وتكمل super إلى طريقة الصنف. لم يُنفذ السكربت.
تجنب تغيير مستدعين غير مرتبطين بترقيع عام
تسمح Ruby بإعادة فتح الأصناف واستبدال طرق تؤثر في مكتبات لم تختر التغيير. فضّل غلافا مسمى أو تركيبا أو تقنية محددة النطاق. لـ refinements تفعيل معجمي وليست بديلا عاما لكل تجاوز. تحميل الشيفرة وتطبيق المزيج وإدارة المورد أفعال بأعمار مختلفة. راجع ترتيب الأسلاف والرؤية والكلمات والإخفاق في التنفيذ المختار قبل الاعتماد. لا تُجري الدورة ترقيعا لمضيفها أو تحميل إطار أو تنفيذ Ruby.
الأخطاء الشائعة وإصلاحها
تظهر طريقة على الصنف لا مثيلاته.
- لماذا يحدث؟
- استُخدمت extend حيث كان المطلوب دمج المثيل بـ include.
- كيف تصلحه؟
- اختر العملية للمستقبل والعقد المطلوبين.
- كيف تتجنب تكراره؟
- افحص استدعاءات الصنف والمثيل منفصلة.
يعيد غلاف nil بدلا من القيمة الأصلية.
- لماذا يحدث؟
- أصبح الرصد التعبير الأخير بعد super.
- كيف تصلحه؟
- احفظ النتيجة المركبة المقصودة وأعدها.
- كيف تتجنب تكراره؟
- اختبر معنى الرد لا استدعاء super فقط.
يكسر ترقيع مشترك مكتبة غير مرتبطة.
- لماذا يحدث؟
- غيّر تعديل صنف عام مستدعين خارج النطاق المقصود.
- كيف تصلحه؟
- استخدم غلافا صريحا أو حد تعاون أضيق.
- كيف تتجنب تكراره؟
- راجع المستقبلات وترتيب البحث قبل تغيير سلوك أساسي.
اختبر فهمك
1. لماذا لا يكفي تضمين وحدة تسجيل لتحديد من يغلق مورد إخراجها؟
اعرض الحل المشروح
لا تسند إعادة الطرق ملكية العمر. قد يستعير السجل مصبا يملكه العميل أو يملك آخر، ولكل منهما تنظيف مختلف. صرّح بالاقتناء والإتمام والفشل والإغلاق. لا يغلق المزيج موردا مشتركا بصمت لمجرد قدرته على استدعاء طرقه.
2. ما الذي يُفحص عند استبدال super بـ super()؟
اعرض الحل المشروح
لا تمرر الثانية معاملات، فقد يفشل الأب المحتاج مدخلات أو يستخدم افتراضيات مختلفة. افحص عقده وتوقيع الغلاف واحفظ الكلمات وفق Ruby 3. تحقق من الرد والفشل ولا تعد التغيير مجرد ترقيم أسلوبي.
أهم ما تعلمته
- يجب أن تبقى مساحة الاسم والمستقبل والبحث والعمر صريحة.
- يحفظ الغلاف عقد السلوك بحفظ نتائجه وإخفاقاته.