يُعد نظام الوحدات في روبي أداة قوية لتنظيم التعليمات البرمجية وإعادة استخدامها. تتيح طريقتان رئيسيتان، وهما include
و extend
، دمج وظائف الوحدة في الفئات، لكنهما تفعلا ذلك بطرق مختلفة جوهرياً. توضح هذه المقالة الاختلافات بينهما وتُرشدك لاختيار الطريقة المناسبة لاحتياجاتك.
محتويات
فهم include
في روبي
تُضيف طريقة include
طرق الوحدة إلى مثيلات الفئة. سيرث كل كائن مُنشأ من الفئة هذه الطرق ويستطيع استخدامها.
module Sayable
def speak(message)
puts message
end
end
class Dog
include Sayable
end
sparky = Dog.new
sparky.speak("Woof!") # => Woof!
في هذا المثال، تكتسب مثيلات Dog
، مثل sparky
، طريقة speak
بسبب include
.
فهم extend
في روبي
extend
، على العكس، تُضيف طرق الوحدة مباشرة إلى الفئة نفسها، وليس إلى مثيلاتها. يمكن استدعاء هذه الطرق على الفئة ولكن ليس على الكائنات الفردية المُنشأة من تلك الفئة.
module Growlable
def growl
puts "Grrrr!"
end
end
class Cat
extend Growlable
end
Cat.growl # => Grrrr!
whiskers = Cat.new
# whiskers.growl # => NoMethodError: undefined method 'growl' for #<Cat:0x...>
يمكن فقط لفئة Cat
استدعاء growl
؛ لا يمكن لـ whiskers
، وهي مثيل لفئة Cat
، ذلك.
متى نستخدم include
مقابل extend
يعتمد القرار كلياً على ما إذا كنت تحتاج إلى طرق قابلة للوصول إليها على مستوى المثيل أو مستوى الفئة.
- استخدم
include
عندما: تقوم بإضافة طرق يجب أن تكون متاحة لكل كائن (مثيل) من الفئة. هذه هي الحالة الأكثر شيوعاً. فكر في إضافة سلوكيات أو وظائف إلى كائنات فردية. - استخدم
extend
عندما: تقوم بإضافة طرق تعمل على الفئة نفسها، مثل طرق مستوى الفئة (مثل، طرق إنشاء الكائنات)، أو طرق تُعدّل سلوك الفئة. عادةً ما لا تتطلب هذه الطرق الوصول إلى متغيرات المثيل.
خاتمة
include
و extend
كلاهما أداتان قيّمتان في ترسانة روبي. إن فهم سلوكيهما المتميزين – طرق مستوى المثيل مقابل طرق مستوى الفئة – أمر بالغ الأهمية لكتابة تعليمات برمجية نظيفة وقابلة للصيانة وفعالة. يؤثر اختيار النهج الصحيح بشكل كبير على تصميم التعليمات البرمجية وقابليتها للقراءة.
الأسئلة الشائعة
- هل يمكنني استخدام
extend
مع وحدات متعددة؟ نعم، يُضيف استخدامextend
مع وحدات متعددة طرقها إلى الفئة. - هل يمكنني استخدام
include
وextend
مع نفس الوحدة؟ نعم، مما يوفر كل من طرق مستوى المثيل وطرق مستوى الفئة من تلك الوحدة. - ماذا يحدث إذا عرّفت الوحدات طرقًا بنفس الاسم؟ تفوز الوحدة الأخيرة التي تم تضمينها أو توسيعها؛ حيث تُلغي طريقتها الطرق الأخرى (إلغاء طريقة).
- هل هناك آثار على الأداء؟ عادةً ما تكون اختلافات الأداء ضئيلة. أعطي الأولوية لتصميم التعليمات البرمجية على تحسينات الأداء الطفيفة.