Code Smell , تخلص من السباجيتي , الجزء الأول !
تحدثنا في المقال السابق عن ضرورة عملية إعادة بنية التعليمات البرمجية (Refactoring) ودورها الكبير في تحسين التطبيق وسرعة فهمه وسهولة إصلاح أخطاءه , و في نفس السياق أشرنا إلى عدم جعلها عملية بدون هدف محدد ومهام , حتى لا تبقى العملية مفتوحة
عمليات إعادة بنية التعليمات البرمجية
التأكد من عمل الوحدات الإختبارية الخاصة بالتطبيق 100% -> البحث عن Code Smell -> توضيح التحسينات وعمليات التبسيط -> تنفيذ التحسينات وعمليات التبسيط -> التأكد من عمل الوحدات الإختبارية 100% بعد العمليات
ما هو ال Code Smell:
أماكن في التعليمات البرمجية تؤشر إلى وجود شيء خاطيء , أو ممكن أن تسبب خطأ
تكرار التعليمات البرمجية : في كثير من الأحيان تشاهد أن التعليمات البرمجية مكررة في أكثر من مكان بنفس البناء ولذلك من الأفضل وضعها في مكان واحد وإستدعائها منه حتى تسهل حل الخطأ والتعديل ويمكن حلها بطريقتين
– إستخراج دالة وظيفية (Extract Method) : ويتم من خلال عمل دالة يوجد فيها نفس البناء البرمجي وإستدعائها بدل من البناء البرمجي المتكرر
– سحب الدالة الوظيفية عند تكرارها في أبناء الصنف (Pull Up method) : عند وجود تكرار في أبناء الصنف فيمكن سحب الدالة ووضعها في الأب ليتمكن الأبناء من استدعائها
الدوال الوظيفية الطويلة (Long Methods) : بالعادة من الصعب جدا فهم الدوال الطويلة بالذات أنها تكون متعددة الوظائف لذلك يمكن إستخراج دوال مثل فكرة Extract Method وإستدعائها في داخل الدالة الوظيفية
الصنف الطويل (Large Class) : عندما يحوي الصنف الكثير من التعليمات البرمجية , المتغيرات , التكرار ويمكن حل المشكلة بطريقتين حسب الحالة
– إستخراج الصنف (Extract Class) : إذا وجدنا أنه يمكن وضع صنف منفصل لعمليات مخصصة يتم إستخراجه من الصنف الطويل وعمله كصنف مستقل ومن ثم تمريره إلى الصنف الطويل من خلال متغير
– إستخراج ابن للصنف (Extract Subclass) : إذا كان بالإمكان عمل ابن للصنف بحيث يكون يعتمد على الصنف الطويل وبالتالي يورث كل المهام المطلوبة ويكون صنف مستقل بمهامه
طول المعاملات (Long Parameter List) : من الصعب فهم المعاملات الطويلة في الدوال , لذلك يتم إستبدال المعاملات الطويلة بدوال (Replace Parameter with Method)
void setValue (String name, int value) {
if (name.equals(“height”)) {
_height = value;
return;
}
if (name.equals(“width”)){
_width = value;
return;
}
}
حيث يمكن تحويل المعاملات إلى دوال مثل
void setHeight(int arg) {
_height = arg;
}
void setWidth (int arg) {
_width = arg;
}
سيكون لنا تكملة في المزيد من عمليات ال Refactoring ومناطق ال Code Smell
دمتم بود , إلى تدوينة أخرى