استخراج المتغيرات (Extract Methods)
المشكلة
وجود تعبيرٍ (expression) معقِّد يصعُب فهمه.
الحل
وضع ناتج التعبير أو جزءٍ منه في متغيِّرات (variables) واضحةٍ تُسهِّل الفهم.
مثال
قبل إعادة التصميم
نلاحظ وجود تعبيرٍ شرطيٍّ (conditional expression) معقَّدٍ وبعدّة أجزاء كما في الشيفرة الآتية:
a
void renderBanner() {
if ((platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 )
{
// do something
}
}
بعد إعادة التصميم
ستحتوي كلٌّ من المتغيِّرات isMacOs
و isIE
و wasResized
قيمةً منطقيّةً (boolean) ناتجةً عن المُعامِل المنطقي <
، وستُستخدَم تلك المتغيِّرات في الشرط ليصبح أسهل فهمًا وقراءةً كما في الشيفرة:
void renderBanner() {
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIE = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;
if (isMacOs && isIE && wasInitialized() && wasResized) {
// افعل شيئًا هنا
}
}
لم إعادة التصميم؟
يهدف استخراجُ المتغيِّرات إلى تبسيط التعابير المعقَّدة عبر تقسيمها لعدّة أجزاء مرحليّة، وهذا يشمل:
- التعابير الشرطيّة للمعامل
if
أو أيَّ جزءٍ من المعامل الثلاثي ?:
في لغات البرمجة المعتمدة على لغة C (C-based). - التعابير الرياضيّة (arithmetic) الطويلة غير المعتمدة على النتائج المرحليّة.
- الأسطر الطويلة متعددة الأجزاء.
وقد يكون استخراج المتغيِّرات كخطوةٍ سابقةٍ لاستخراج التوابع (extract methods) إن كان التعبير المُستخرَج مستخدمًا بمواضع متفرِّقة في الشيفرة.
فوائد تطبيق الحل
الحصول على شيفرة واضحةٍ سهلة القراءة وخاصّة بإعطاء المتغيِّرات أسماء معبِّرةً مساعدةً توضِّح عيانًا الهدف من المتغيِّر، مثل: customerTaxValue
و cityUnemploymentRate
و clientSalutationString
و ...إلخ. إذ كلما زادت قابلية قراءة الشيفرة (code readability) قلّت الحاجة إلى التعليقات (comments) التوضيحيّة الطويلة.
مساوئ تطبيق الحل
احتواء الشيفرة متغيِّراتٍ إضافيّةً ولكنّ توضيح الشيفرة وتحسينها يبرِّران ذلك.
آلية الحل
- إضافة سطرٍ جديدٍ قبل التعبير المعقَّد المُراد تبسيطه والتصريح عن متغيِّر جديدٍ فيه، ومن ثمّ إسناد جزءٍ من التعبير لهذا المتغيِّر.
- تبديل ذلك الجزء من التعبير إلى المتغيِّر المعبِّر عنه (المُنشأ في الخطوة السابقة).
- تكرار الخطوتين السابقتين لكل الأجزاء المعقَّدة في التعبير حتى الوصول إلى نتيجة مُرضية.