إنشاء التوابع (Composing Methods)
< Refactoring | techniques
تستهدف إعادة التصميم بشكل رئيسيٍّ إنشاء التوابع الصحيحة المناسبة، إذ تكون التوابع الطويلة سببًا للمشاكل في كثيرٍ من الحالات، وتجعل شيفرات بعض التوابع منطق التنفيذ (execution logic) غامضًا ويصبح التابع بهذا عصيَّ الفهم من جهةٍ وصعب التغييرٍ من جهة ثانية.
يشمل هذا القسم من الحلول كلَّ ما يتعلق بالتوابع وإزالة التكرار (duplicates) في الشيفرة ليسمح بإجراء التطويرات المستقبليّة، وهذه التقنيات هي:
- استخراج التوابع (Extract Methods)
- المشكلة: وجود أجزاء من الشيفرة يُمكن عزلها وتجميعها سويةً.
- الحل: نقل الشيفرة إلى تابعٍ (method) أو دالةٍ (function) جديدة والاستعاضة عن الجزء (بمكانه السابق) باستدعاءٍ لهذا التابع الجديد.
- دمج التوابع (Inline Methods)
- المشكلة: أن يكون محتوى التابع (method body) بسيطًا وواضحًا أكثر من التابع بحدِّ ذاته، ويمكن عندئذٍ الاستغناء عنه.
- الحل: نقل الشيفرة الموجودة في التابع (محتوى التابع) إلى مواقع استدعائه، وحذف التابع برمته إذ لا داعي له.
- استخراج المتغيِّرات (Extract Variables)
- المشكلة: وجود تعبيرٍ (expression) معقِّد يصعُب فهمه.
- الحل: وضع ناتج التعبير أو جزءٍ منه في متغيِّرات (variables) واضحةٍ تُسهِّل الفهم.
- دمج المتغيِّر المؤقّت (Inline Temp)
- المشكلة: وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه.
- الحل: تبديل كلُّ مرجعيّةٍ (reference) للمتغيِّر ليحلَّ محلَّها التعبيرُ نفسه.
- تبديل المتغير الوسيط إلى استدعاء (Replace Temp with Query)
- المشكلة: تخزين نتيجة تعبيرٍ ما (expression) في متغيِّر محليٍّ (local variable) لاستخدامه لاحقًا في الشيفرة.
- الحل: نقل التعبير بأكمله إلى تابعٍ (method) مستقلٍ يعيد نتيجته، وعندها سيكون استدعاء هذا التابع بديلًا عن استخدام المتغيِّر (variable)، ومن الممكن أيضًا دمج هذا التابع مع توابع أخرى عند الحاجة للقيام بذلك.
- تجزئة المتغيِّر المؤقَّت (Split Temporary Variable)
- المشكلة: وجود متغيِّرٍ محليّ يُستخدَم لتخزين عدّة قيمٍ مؤقتةٍ (مرحليّة) داخل التابع.
- الحل: استخدام متغيِّراتٍ منفصلةٍ ومستقلّةٍ للقيم المختلفة، بحيث يكون كلَُ متغيِّرٍ مسؤولًا عن تخزين البيانات لمهمةٍ واحدةٍ فقط.
- إزالة الإسناد إلى المعاملات (Remove Assignments to Parameters)
- المشكلة: إسناد قيمةٍ ما إلى أحد المعاملات (parameter) داخل التابع (method body).
- الحل: استخدام متغيِّرٍ محليٍّ (local variable) بدلًا من المعامل.
- تبديل التوابع إلى كائنات التوابع (Replace Method with Method Object)
- المشكلة: وجود تابعٍ طويلٍ بالكثير من المتغيِّرات المحليّة (local variables) المتداخلة والتي تحول دون تطبيق تقنية الحل باستخراج التابع (extract method).
- الحل: نقل التابع إلى صنفٍ (class) مستقلٍ بحيث تصبح متغيِّراته المحليّة حقولًا (fields) لهذا الصنف، وتقسيم التابع بعد ذلك إلى عدّة توابع أصغر في الصنف ذاته.
- استبدال الخوارزمية (Substitute Algorithm)
- المشكلة: الحاجة إلى استبدال خوارزميّة ما بخوارزميّة أخرى.
- الحل: تعديل محتوى التابع (method body) الذي يُنفِّذ الخوارزمية السابقة ليُنفِّذ الخوارزمية الجديدة.