مقدمة:
السلام عليكم...
أعرض في هذه الدروس كل بعد فترة ممارسة من الممارسات البرمجية التي نفعلها دائما
و يجعل لنا الخبراء طرقا افضل لذلك..
ويقدم لنا خبراء البرمجة السريعة (Agile) (وهي أحد العمليات processes المتبعة في هندسة البرمجيات لتحسين كتابة البرامج)
مجموعة من هذه الممارسات التي تواجه كل مبرمج في حياته البرمجية اليومية...
لنتكلم عن الممارسات المفضلة للبرمجة
الدرس الأول: الكود المتكرر
كيف يتكون الكود المتكرر؟
يتكون الكود المتكرر في حالة أنه يوجد "طريقتان" أو "دالتان" "Methods or Functions" يتكرر فيهما نفس الكود ولو اختلف الغرض منه....
مثال:
في المثال التالي نريد أن عمل عمليتين على المصفوفة وهي إضافة عنصر غير متكرر و حذف عنصر...
لاحظ الكود في الحالتين... هل ترى تشابه؟؟؟
/** صف عمليات على المصفوفة **/
public class ArrayOperations()
{
/** المصفوفة **/
private ArrayList MyArray = new ArrayList();
/** اضافة عنصر غير متكرر **/
public boolean AddElement( Element Object)
{
/** البحث داخل المصفوفة **/
foreach ArrayElement in MyArray
{
/** إذا كان الذي نريد حذفه هو نفس الذي وصلنا إليه في عملية البحث**/
if ( ArrayElement == Element)
{
/** العنصرغير موجود **/
return false;
}
}
/** اضافة عنصر غير متكرر **/
MyArray.Add( Element );
}
/** حذف عنصر **/
public boolean DeleteElement( Element Object)
{
/** البحث داخل المصفوفة **/
foreach ArrayElement in MyArray
{
/** إذا كان الذي نريد حذفه هو نفس الذي وصلنا إليه في عملية البحث**/
if ( ArrayElement == Element)
{
/** احذف العنصر الذي وجدناه من المصفوفة عن طريق رقم العنصر **/
MyArray.Delete( ArrayElement.Index );
}
}
/** العنصرغير موجود **/
return false;
}
}
بعد المثال اتضح لنا ان عملية البحث مشتركة بين الإثنين ولهذا تكرر لدينا نفس الكود مرتين...ولكن..
لماذا نريد أن نحذف الكود المتكرر؟
1. لأننا قد نضيف عمليات أخرى جديدة تحتاج نفس عملية البحث التي تكررت مرتين...وليس من المعقول كتابتها مرة أخرى!!
2. تخيل لو أننا أردنا تحسين عملية البحث بتطبيق خوارزمية افضل مثلا... هل نضطر ان نغير كل عملية؟؟
3. لو نظرت إلى المثال بالكود المتكرر والمثال الذي يحمل الحل لوجدت فرقا حتى في فهمنا للكود....فرق في الوضوح والقراءة والفهم..
4. لو كان هناك صفا آخر (Class) يرث (Inherent) من هذا الصف فإنه لا يستطيع ان يستفيد من عملية البحث هذه..
كيف نحذف الكود المتكرر؟
لننظر إلى نفس المثال..
/** صف عمليات على المصفوفة **/
public class ArrayOperations()
{
/** المصفوفة **/
private ArrayList MyArray = new ArrayList();
/** البحث داخل المصفوفة **/
public Element SearchForElement( Element Object)
{
/** البحث داخل المصفوفة **/
foreach ArrayElement in MyArray
{
/** إذا كان الذي نريد حذفه هو نفس الذي وصلنا إليه في عملية البحث**/
if ( ArrayElement == Element)
{
return ArrayElement;
}
}
/** العنصرغير موجود **/
return null;
}
/** اضافة عنصر غير متكرر **/
public boolean AddElement( Element Object)
{
If ( SearchForElement( Element ) != NULL )
{
/** اضافة عنصر غير متكرر **/
MyArray.Add( Element );
return ture;
}
/** العنصرغير موجود **/
return false;
}
/** حذف عنصر **/
public boolean DeleteElement( Element Object)
{
If ( SearchForElement( Element ) != NULL )
{
/** احذف العنصر الذي وجدناه من المصفوفة عن طريق رقم العنصر **/
MyArray.Delete( ArrayElement.Index );
}
/** العنصرغير موجود **/
return false;
}
}
إذا كان هناك كود متكرر يجب حذفه من كل الطرق التي تكرر فيها ومن ثم يجمع في عملية او طريقة او دالة لوحدها وبعد ذلك تستخدم في كل مكان تم حذف الكود المتكرر منها.
****ملاحظة: إذا لم يوجد كود متكرر ، لا تخترع واحدا لأنك قد تضيق على نفسك بدلا من ان توسع..
الخاتمة:
إن الكود المتكرر يبدو شيئا سهلا ، ولكنه مهم ويدل على مدى احتراف المبرمج وقدرته على اكتشاف المتشابهات والاستفادة منها. وهي تسهل على قارئ الكود من بعده على فهم ماكتبه المبرمج بالاضافة إلى المميزات الاخرى التي ذكرناها...
الدرس القادم:
عن تحويل التعليق (Comment) إلى كود
المراجع:
www.agileskills.org