مرجع
آخر الزيارات

تكرار الكود

703 كلمة•0 مشاهدة•🗒️ منذ 12 يوماً
باختصار: إن تكرار الكود هو مصطلح لبرمجة الحاسوب للتعبير عن تعاقب كود مصدري لأكثر من مرة، سواء أن كان في نفس البرنامج أو في برامج مختلفة مملوكة من قبل نفس الكيان. تجد هنا «كيفية خلق المكررات»، «مماثلة حرف مقابل حرف» و«اكتشاف تكرار الرموز» ضمن 13 قسماً.
المحتويات
  1. كيفية خلق المكررات
  2. مماثلة حرف مقابل حرف
  3. اكتشاف تكرار الرموز
  4. مثال على التماثل الوظيفي
  5. average2 = sum2/4;
  6. }
  7. average1 = sum1/4;
  8. int sum = 0;
  9. مشاكل متعلقة بتكرار الكود
  10. Atomiq – تجاري
  11. int average2 = 0;
  12. أدوات
  13. مماثلة رمز مقابل رمز
تكرار الكود

قبل الخوض في التفاصيل، إن تكرار الكود هو مصطلح لبرمجة الحاسوب للتعبير عن تعاقب كود مصدري لأكثر من مرة، سواء أن كان في نفس البرنامج أو في برامج مختلفة مملوكة من قبل نفس الكيان. يعتبر تكرار الكود ظاهرة غير مرغوب بها لعدة أسباب. إن الحد الأدنى المطلوب يُطبق على مقدار من الكود التي يجب أن تظهر بشكل متسلسل حتى تعتبر مكررة فضلاً عن اعتبارها متشابهة بمحض الصدفة. تسلسل تكرار الكود أحيانا تُعرف باستنساخات. وتعرض الأقسام التالية جوانب أخرى من الموضوع.

الطرق التالية تشير إلى كيفية تكرار الكود المتسلسلة:

كيفية خلق المكررات

وفي هذا السياق، برمجة النسخ واللصق، حيث يتم نسخ جزء من الكود «لأنه يعمل». وفي أغلب الحالات تتضمن تلك العملية تعديلات بسيطة في الكود المنسوخ مثل إعادة تسمية المتغيرات أو إدخال/حذف جزء من الكود.

يوجد الكثير من الأسباب لظهور تكرار الرموز، ومن ضمنهم:

كذلك، وجود وظيفة مماثلة إلى حدّ كبير لوظيفة أخرى مطلوبة في برنامج أخر فيكتب المبرمج بشكل مستقل كود مشابه لما هو موجود سابقاً.

سرقة فكرية، حيث يتم نسخ الكود بدون إذن أو إسناد.

مماثلة حرف مقابل حرف

مماثلة حرف مقابل حرف مع تجاهل المسافات والتعليقات

اكتشاف تكرار الرموز

  • تم اقتراح عدد من الخوارزميات المختلفة لاكتشاف تكرار الكود. مثلًا:
  • خوارزمية بيكر.
  • خوارزمية سلسلة بحث رابين كارب.
  • استخدام شجرة التركيب المجردة.
  • كشف الاستنساخ البصري.

مثال على التماثل الوظيفي

  • extern int array1[];
  • extern int array2[];
  • int sum1 = 0;
  • int sum2 = 0;
  • int average1 = 0;

من جانب آخر، لاحظ هذا المثال المأخوذ من قصاصة رمز لحساب الـالمتوسط الرياضي لـمجموعة هيكل البيانات لـالأعداد الصحيحة

average2 = sum2/4;

  • يمكن كتابة الحلقتين التكرارتين كمعادلة واحدة:
  • int calcAverage (int* Array_of_4)
  • {

}

  • باستخدام المعادلة السابقة ينتج كود مصدري ليس له حلقة مكررة:
  • extern int array1[];
  • extern int array2[];
  • int average1 = calcAverage(array1);
  • int average2 = calcAverage(array2);

average1 = sum1/4;

  • for (int i = 0; i < 4; i++)
  • {
  • sum2 += array2[i];
  • }

int sum = 0;

  • for (int i = 0; i < 4; i++)
  • {
  • sum += Array_of_4[i];
  • }
  • return sum/4;

مشاكل متعلقة بتكرار الكود

من جانب آخر، تضخيم الكود يؤثر على الفهم: غالباً ما يؤدي تكرار الكود إلى خلق أقسام من الكود طويلة ومكررة، تختلف فقط في خطوط قليلة أو حروف. وهذا الطول قد يؤدي إلى صعوبة فهم الكود بشكل سريع. وهذا يتضاد مع مبدأ «أفضل ممارسة» لـتحليل الكود.

إضافةً إلى ذلك، إخفاء الغرض: تكرار أقسام كبيرة من الكود المتماثلة قد يخفي كيف يختلف كل كود عن الأخر، وبالتالي، يختفي الغرض المحدد لكل قسم من الكود. غالباً ما يكون الاختلاف الوحيد في محيط المعامل. وأفضل ممارسة في هذه الحالة هي إعادة استخدام روتين فرعي.

في هذا الإطار، غالباً ما يعتبر تكرار الكود دليل على أسلوب برمجة فقير أو كسول. فيعتمد أسلوب الترميز الجيد على إعادة استخدام الكود. قد يكون من الأسرع للبرمجة من خلال تكرار الكود، حيث لا يشغل المبرمج طريقة استخدام الكود أو كيفية استخدامه في المستقبل. تكمن الصعوبة في أن التطوير الأصلي هو جزء صغير من دورة حياة المنتج، وباستخدام تكرار الكود تتضاعف تكاليف الصيانة. بعض المشاكل المحددة هي:

وفي هذا الصدد، تحديث الحيود: يناقض تكرار الكود مبدأ أساسي من نظرية قاعدة البيانات: تجنب التكرار. عدم التقيد يتحمل تحديث الحيود، والذي يزيد من تكلفة الصيانة، لأن أي تعديل يطرأ على أي كود يجب أن يُطبق على كل تكرار بشكل منفرد. وفي أفضل الحالات، يتم ضرب وقت الكويد والاختبار في عدد التكرارات. وفي أسواء الحالات، بعض المواقع لا يتم تحديثها، ومثلًا قد تظهر الأخطاء البرمجية المُعتقد أنه تم إصلاحها في الأماكن المكررة لشهور أو سنوات. وأفضل ممارسة هنا هي مكتبة برمجية.

Atomiq – تجاري

من جانب آخر، ConQAT (مصدر مفتوح، يدعم: ABAP، أيدا، كوبول، C/C++، C#، جافا، PL/I، PL/SQL، بيثون، نص، إجراء SQL، فيجوال بيسك، XML)

  • Checkstyle (جافا)
  • CloneAnalyzer (C/C++ وجافا / برنامج مساعدة ايكليبس فقط)
  • Clone Digger (بايثون وجافا)
  • JPlag (جافا، C#، C، C++، نص لغات طبيعية ومتداخلة)
  • Pattern Miner (CP Miner) - تجاري
  • Simian (برنامج) - تجاري
  • CodePro Analytix – تجاري
  • انظر كذلك
  • رائحة الكود
  • لا تكرر نفسك
  • شجرة بنية مجردة

علاوةً على ذلك، CCFinder (C/C++، جافا، كوبول، فورتران، الخ / غير متكافئ مع نظم تشغيل غير ويندوز)

Black Duck Suite – تجاري (سلسلة برامج تحليلية)

إضافةً إلى ذلك، مكتشف النسخ/اللصق (CPD) من بي ام دي (جافا، بي اتش بي، فورترن JSP, C, C++,)

علاوةً على ذلك، CloneDR – تجاري (أيدا, C, C++, C#, جافا، كوبول, فورترن، بايثون, VB.net, VB6, PHP4/5, PLSQL, SQL2011, XML, وأخرون)

int average2 = 0;

  • for (int i = 0; i < 4; i++)
  • {
  • sum1 += array1[i];
  • }

أدوات

تتضمن أدوات تحليل تكرار الكود التالي:

مماثلة رمز مقابل رمز

وفي السياق ذاته، مماثلة رمز مقابل رمز مع تغيرات نسبية (مثل: ادخال/حذف/تعديل الرموز)

مماثل وظيفياً

ما رأيك في هذه المقالة؟

📝 هل في هذه المقالة خطأ؟

إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.