نقل التابع (Move Method)

من موسوعة حسوب
< Refactoring
مراجعة 09:33، 2 مارس 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المشكلة

استخدام التابع (method) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ.

الحل

إنشاء تابعٍ جديدٍ في الصنف الأكثر استخدامًا لذلك التابع ونقل شيفرته إلى التابع الجديد، ثم تحويل الشيفرة في التابع الأصليّ إلى مرجعيّةٍ للتابع الجديد في الصنف الآخر أو حذفه كليَّا.

مثال

قبل إعادة التصميم

يستخدِم الصنفُ Class2 التابعَ aMethod()‎ أكثر مما يستخدمه صنفه الأساسيّ Class1:

يستخدِم الصنفُ Class2 التابعَ aMethod()‎ أكثر مما يستخدمه صنفه الأساسيّ Class1.
يستخدِم الصنفُ Class2 التابعَ aMethod()‎ أكثر مما يستخدمه صنفه الأساسيّ Class1.

بعد إعادة التصميم

نُقِل التابع aMethod()‎ إلى الصنف ذي الاستخدام الأكثر له وهو الصنف Class2:

نُقِل التابع aMethod()‎ إلى الصنف ذي الاستخدام الأكثر له وهو الصنف Class2.
نُقِل التابع aMethod()‎ إلى الصنف ذي الاستخدام الأكثر له وهو الصنف Class2.

لم إعادة التصميم؟

  1. لجعل الأصناف (classes) أكثر ترابطًا على المستوى الداخلي، وذلك بنقل التابع إلى الصنف الذي يحتوي معظم البيانات التي يحتاجها.
  2. الحدُّ من الاعتماديّة (dependency) ما بين الأصناف أو التخليّ عنها، والمقصود بالاعتماديّة هو اعتماد الصنف الذي يستدعي التابع على الصنف الذي يحتوي ذلك التابع، ويبدو ذلك مفيدًا بشكلٍ خاصّ عندما يكون الصنف الذي يستدعي التابع معتمدًا بالأصل (قبل إعادة التصميم) على الصنف الذي نُقل إليه التابع.

آلية الحل

  1. إعادة النظر بكلِّ الميّزات (features) التي يستخدمها التابع (method) في صنفه الأصليّ، فقد يكون من الأفضل نقلها كذلك، ولتكن القاعدة: تُنقَل الميّزات إلى التابع إن كانت غير مُستخدَمةٍ إلا من قِبله، أمّا بوجود توابع أخرى تستخدم تلك الميّزة فمن المهمّ نقلها أيضًا، إذ من الأسهل (في بعض الأحيان) نقلُ عددٍ كبيرٍ من التوابع بدلًا من تسوية العلاقات بينها عبر صنفين مختلفين. كما ويجب التأكُّد من أنّ التابع غير مصرَّحٍ عنه (not declared) في الأصناف الأعلى (superclasses) أو الأصناف الفرعيّة (subclasses)، وإلا فإمّا أن تتخلى عن فكرة النقل أو أن تلجأ إلى التعدديّةً الشكليّةً (polymorphism) في الصنف المستقبِل (recipient class) لضمان فعاليّة (functionality) التابع المتوزِّع في عدَّة أصناف.
  2. التصريح عن التابع الجديد في الصنف المستقبِل (recipient class) وقد يُعطى اسمًا جديدًا معبِّرًا أكثر من الاسم السابق.
  3. توفير المرجعيّة إلى الصنف المستقبِل، فقد يكون هنالك بالأصل حقلٌ (field) أو تابعٌ (method) يعيد كائنًا (object) مناسبًا، وإن لم يكن ذلك فلا بُدَّ من إنشاء حقلٍ أو كتابة تابعٍ جديدٍ لتخزين كائن الصنف المستقبِل، وبهذا تضمن سهولة الوصول إلى الصنف المستقبِل والتابع الجديد فيه، وبقي تحويل التابع السابق إلى مرجعيّة (reference) لهذا التابع الجديد.
  4. التأكُّد من القدرة على حذف التابع السابق بأكمله، والإشارة بمرجعيّة إلى التابع الجديد في كافّة المواضع التي تستخدم التابع السابق.

انظر أيضًا

مصادر