Code Smell , تخلص من السباجيتي , الجزء الثاني!

نستكمل ما بدأناه في تدوينة الجزء الأول  حيث تحدثنا فيها عن ال Code Smell والأماكن التي من الممكن أن تكون سبب لعطب وعدم فهم التعليمات البرمجية

نتابع ال Code Smells وطرق معالجتها

خاصية الحسد (Feature Envy) :

سميت بذلك لأن الحسد يقوم على أساس أن تتمنى أن تملك شيء ويفقده الآخر , وهي نفس الفكرة من حيث أن قد يكون صنفين أحدمها يستخدم دالة من صنف آخر ويحتاجها ويستعملها أكثر من الصنف الذي يحوي تعريف هذه الدالة , لذلك يتم معالجتها عن طريق نقل هذه الدالة إلى الصنف الذي يستعملها من خلال

– نقل الدالة (Move Method) : يتم من خلالها نقل تعريف ومحتوى دالة من صنف لا يستعملها كثيرا إلى صنف آخر يستعملها ويحتاجها أكثر وتتم من خلال تعريف الدالة كما هي في الصنف القديم ووضعها في الصنف الجديد , على أن نقوم بتعويض عنها في الصنف القديم بإستدعائها من الصنف الجديد

 

Move Method
Move Method

مثال سنقوم بنقل الدالة participate من صنف Person إلى Project

class Project {

Person[ ] participants;

}
class Person {

int id;

boolean participate(Project p)  {
for(inti=0; i<p.participants.length; i++)
{   if (p.participants[i].id == id) return(true);
}
return(false);
}

}
… if (x.participate(p)) …

وبالتالي نقوم نقلها , وندائها بالطريقة الجديدة

class Project {

Person[ ] participants;

 boolean participate(Person x)
{ for(int i=0; i<participants.length; i++) {
if (participants[i].id == x.id) return(true);
} return(false);
}

}
class Person {

int id;

}
… if (p.participate(x)) …

الجمل التبديلية (Switch Statements) :

هناك الكثير من الجمل التبديلية التي يمكن تحويلها إلى متعددة الأشكال (polymorphism)

polymorphism
polymorphism

مثال : بدلا من إستخدام الشرط على نوع الحيوان

class Cat
{
function makeSound() {print “miaw”;}
}class Dog
{
function makeSound(){print “Wuff”;}
}

function printTheRightSound($type)
{

switch ($type) {
case “cat”:{

$cat = new Cat();
$cat->makeSound();
}break;
case “dog”:{
$dog = new Dog();
$dog->makeSound();
}break;
}

}

printTheRightSound(“cat”);

فيمكن إستبدال الجمل التبديلية في دالة printTheRightSound بمتعددة الأشكال

abstract class Animal
{
abstract function makeSound();
}class Cat extends Animal
{
function makeSound(){print “miaw”;}
}

class Dog extends Animal
{
function makeSound(){print “Wuff”;}
}

function printTheRightSound($obj)
{
if ( $obj instanceof Animal )
{print $obj->makeSound();}
}

printTheRightSound(new Cat());

 

الصنف الكسول (Lazy Class) :

كل صنف يتم بناءه يكلف وقت وجهد من ناحية البناء ومن ناحية الفهم , لذلك إن كانت هناك أصناف فرعية لا تستخدم كثيرا يمكن ضمها إلى آصناف آخرى لتقوم هي بالدور مما يعرف بضم الهيكلية

– ضم الهيكلية (Collapse Hierarchy) : من خلالها يتم ضم الصنف الغير فاعل إلى صنف آخر يقوم بالدور مما يعرف ب (inline Class)

Collapse Hierarchy
Collapse Hierarchy
Inline Class
Inline Class

 

التعليمات البرمجية المقتولة (Dead Code) :

الأجزاء الغير مستخدمة أو التعليقات (Comments) التي لم تعد لها فائدة , حاول إزالة كل الأشياء التي لا تستعملها فعليا في المشروع

الأرقام السحرية (Magic Numbers) :

هناك بعض الأرقام المستخدمة بصيغتها الرقمية , كل ماعلينا فعله هو تحويلها إلى ثابت (constant)

مثال

static double ConvertPoundsToKilos( double pounds ) { return pounds / 2.2 ; }

static final double KILO_CONVERSION_FACTOR = 2.2;

static double ConvertPoundsToKilos( double pounds ) { return pounds / KILO_CONVERSION_FACTOR ; }

كانت هذه أهم الSmells المشهورة في التطبيقات , أتمنى أن تحسن الكثير لديكم

دمتم بود إلى تدوينة أخرى

لا تعليقات

أترك رد