Code Smell , تخلص من السباجيتي , الجزء الثاني!
نستكمل ما بدأناه في تدوينة الجزء الأول حيث تحدثنا فيها عن ال Code Smell والأماكن التي من الممكن أن تكون سبب لعطب وعدم فهم التعليمات البرمجية
نتابع ال Code Smells وطرق معالجتها
خاصية الحسد (Feature Envy) :
سميت بذلك لأن الحسد يقوم على أساس أن تتمنى أن تملك شيء ويفقده الآخر , وهي نفس الفكرة من حيث أن قد يكون صنفين أحدمها يستخدم دالة من صنف آخر ويحتاجها ويستعملها أكثر من الصنف الذي يحوي تعريف هذه الدالة , لذلك يتم معالجتها عن طريق نقل هذه الدالة إلى الصنف الذي يستعملها من خلال
– نقل الدالة (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)
مثال : بدلا من إستخدام الشرط على نوع الحيوان
{
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 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)
التعليمات البرمجية المقتولة (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 المشهورة في التطبيقات , أتمنى أن تحسن الكثير لديكم
دمتم بود إلى تدوينة أخرى