برمجة النسخ واللصق

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

تطبيق رمز المكتبة
يقوم المبرمجون ذوو الخبرة أيضاً بعمليات النسخ واللصق، وغالباً ما يمتلكون مكتباتهم الخاصة من مقاطع برمجية جاهزة للاستخدام ومختبرة جيداً، بالإضافة إلى خوارزميات عامة يسهل تكييفها مع مهام محددة. [ 2 ]
باعتبارها شكلاً من أشكال تكرار الشيفرة ، تنطوي برمجة النسخ واللصق على بعض المشاكل الجوهرية؛ وتتفاقم هذه المشاكل إذا لم تحافظ الشيفرة على أي رابط دلالي بين النص الأصلي والنسخ. في هذه الحالة، إذا لزم إجراء تغييرات، يُهدر الوقت في البحث عن جميع المواقع المكررة. (يمكن التخفيف من هذه المشكلة جزئيًا إذا تم التعليق على الشيفرة الأصلية و/أو النسخة بشكل صحيح؛ ومع ذلك، حتى مع ذلك، تبقى مشكلة إجراء التعديلات نفسها عدة مرات قائمة. أيضًا، نظرًا لأن صيانة الشيفرة غالبًا ما تُهمل تحديث التعليقات، [ 3 ] فإن التعليقات التي تصف مكان العثور على أجزاء الشيفرة البعيدة معروفة بتقادمها.)
يعترض أنصار منهجيات البرمجة الكائنية التوجه على استخدام "مكتبة التعليمات البرمجية" عبر النسخ واللصق. فبدلاً من إنشاء نسخ متعددة ومُعدَّلة من خوارزمية عامة، يقوم النهج الكائني التوجه بتجريد الخوارزمية إلى فئة مُغلَّفة قابلة لإعادة الاستخدام . تُكتب هذه الفئة بمرونة، مع دعم كامل للوراثة والتحميل الزائد ، بحيث يمكن ربط جميع التعليمات البرمجية المُستدعِية بهذه التعليمات البرمجية العامة مباشرةً، بدلاً من تعديل التعليمات البرمجية الأصلية. [ 4 ] وعند الحاجة إلى وظائف إضافية، يتم توسيع المكتبة (مع الحفاظ على التوافق مع الإصدارات السابقة ). وبهذه الطريقة، إذا احتوت الخوارزمية الأصلية على خطأ برمجي أو كان من الممكن تحسينها، فإن جميع البرامج التي تستخدمها ستستفيد. توفر البرمجة العامة أدوات إضافية لإنشاء التجريدات.
رمز التفرع
يُعدّ التفرّع جزءًا أساسيًا من تطوير البرمجيات في فرق العمل الكبيرة، إذ يسمح بالتطوير المتوازي على كلا الفرعين، وبالتالي تقصير دورات التطوير. يتميز التفرّع التقليدي بالخصائص التالية:
- تتم إدارتها بواسطة نظام تحكم في الإصدارات يدعم التفرع
- يتم إعادة دمج الفروع بمجرد اكتمال التطوير المتوازي.
يُعد النسخ واللصق بديلاً أقل رسمية للتفرع الكلاسيكي، وغالبًا ما يُستخدم عندما يكون من المتوقع أن تتباعد الفروع أكثر فأكثر بمرور الوقت، كما هو الحال عند فصل منتج جديد عن منتج موجود.
تُعدّ برمجة النسخ واللصق طريقةً فعّالةً لإطلاق منتج جديد، إذ لا تُغيّر هذه الطريقة من شفرة المنتج الحالي.
- لا حاجة لإجراء اختبارات التراجع للمنتج الحالي، مما يوفر وقت ضمان الجودة المرتبط بإطلاق المنتج الجديد، ويقلل من وقت الوصول إلى السوق .
- لا يوجد خطر من إدخال أخطاء برمجية في المنتج الحالي، مما قد يزعج قاعدة المستخدمين المثبتة.
أما السلبيات فهي:
- إذا لم يختلف المنتج الجديد عن المنتج الحالي بالقدر المتوقع، فقد يتطلب الأمر دعم قاعدتي بيانات برمجيتين (بتكلفة مضاعفة) بدلاً من قاعدة واحدة. وهذا قد يؤدي إلى إعادة هيكلة مكلفة ودمج يدوي لاحقاً.
- يؤدي تكرار قاعدة التعليمات البرمجية إلى مضاعفة الوقت اللازم لتنفيذ التغييرات التي قد تكون مرغوبة في كلا المنتجين؛ وهذا يزيد من وقت طرح هذه التغييرات في السوق، وقد يؤدي في الواقع إلى محو أي مكاسب زمنية تم تحقيقها من خلال تفرع التعليمات البرمجية في المقام الأول.
على غرار ما سبق، فإن البديل لنهج النسخ واللصق هو النهج المعياري:
- ابدأ بفصل الكود الذي سيتم مشاركته بين كلا المنتجين إلى مكتبات.
- استخدم تلك المكتبات (بدلاً من نسخة ثانية من قاعدة التعليمات البرمجية) كأساس لتطوير المنتج الجديد.
- إذا كان من المتوقع إصدار نسخة ثالثة أو رابعة أو خامسة إضافية من المنتج في المستقبل، فإن هذا النهج يكون أقوى بكثير، لأن مكتبات التعليمات البرمجية الجاهزة تقصر بشكل كبير دورة حياة التطوير لأي منتجات إضافية بعد النسخة الثانية. [ 5 ]
المهام المتكررة أو تنويعات المهمة

يُعدّ نسخ ولصق التعليمات البرمجية أحد أخطر أشكال البرمجة، ويظهر ذلك في التعليمات البرمجية التي تؤدي مهمة متكررة، أو تنويعات على نفس المهمة الأساسية بناءً على متغير ما. حيث تُنسخ كل نسخة من التعليمات البرمجية السابقة وتُلصق مرة أخرى مع تعديلات طفيفة. ومن الآثار الضارة لذلك:
- غالباً ما يؤدي أسلوب النسخ واللصق إلى طرق كبيرة (وهي رائحة كريهة في الكود ).
- تُنشئ كل حالة تكرارًا للبرنامج، مع جميع المشاكل التي نوقشت في الأقسام السابقة، ولكن بنطاق أوسع بكثير. من الشائع وجود عشرات التكرارات؛ بل من الممكن وجود المئات. وتصبح إصلاحات الأخطاء، على وجه الخصوص، صعبة ومكلفة للغاية في مثل هذا البرنامج. [ 6 ]
- يعاني هذا النوع من التعليمات البرمجية أيضاً من مشاكل كبيرة في سهولة القراءة، نظراً لصعوبة تحديد الاختلافات بين كل تكرار وآخر. وهذا يؤثر بشكل مباشر على مخاطر وتكاليف مراجعة التعليمات البرمجية.
- يُثني نموذج البرمجة الإجرائية بشدة عن استخدام أسلوب النسخ واللصق في المهام المتكررة. ففي هذا النموذج، يُفضّل إنشاء دالة أو روتين فرعي يُنفّذ المهمة مرة واحدة فقط؛ ثم يستدعي الروتين الرئيسي هذا الروتين الفرعي، إما بشكل متكرر أو، والأفضل من ذلك، باستخدام بنية تكرارية. يُطلق على هذا النوع من الشيفرة اسم "الشيفرة المُجزأة جيدًا"، ويُنصح به لسهولة قراءته وقابليته للتوسيع. [ 7 ]
- القاعدة العامة التي تنطبق على هذه الحالة هي " لا تكرر نفسك ".
اختيار تصميم متعمد
يُعتبر نسخ ولصق التعليمات البرمجية أسلوبًا مقبولًا في بعض الأحيان. ويُلاحظ ذلك غالبًا في التعليمات البرمجية النمطية، مثل تعريفات الفئات أو استيراد المكتبات القياسية، أو في استخدام قالب برمجي موجود (بمحتوى فارغ أو دوال وهمية) كإطار عمل لإكمال التعليمات البرمجية.
يُشبه استخدام مصطلحات البرمجة وأنماط التصميم البرمجةَ القائمة على النسخ واللصق، إذ يعتمد كلاهما على صيغ برمجية جاهزة. في بعض الحالات، يُمكن التعبير عن ذلك في شكل مقتطف برمجي ، يُمكن لصقه عند الحاجة، مع أنه غالبًا ما يُستدعى من ذهن المبرمج. في حالات أخرى، لا يُمكن اختزال المصطلحات إلى قالب برمجي. مع ذلك، في معظم الحالات، حتى لو أمكن اختزال مصطلح برمجي إلى كود، فسيكون إما طويلًا بما يكفي لتجريده إلى دالة، أو قصيرًا بما يكفي لإدخاله مباشرةً.
لغة برمجة Subtext هي مشروع بحثي يهدف إلى "إلغاء تجريم" القص واللصق. باستخدام هذه اللغة، يصبح القص واللصق نموذج التفاعل الأساسي، وبالتالي لا يُعتبر نمطًا سيئًا .
مثال
مثال بسيط على ذلك هو حلقة for ، والتي يمكن التعبير عنها على النحو التالي .for(inti=0;i!=n;++i){}
قد يكون مثال الكود الذي يستخدم حلقة for هذه كالتالي:
void foo ( int n ) { for ( int i = 0 ; i != n ; ++ i ) { /* جسم الدالة */ } }كان من الممكن إنشاء الكود الحلقي باستخدام المقتطف التالي (مع تحديد الأنواع وأسماء المتغيرات):
for ( $type $loop_var = 0 ; $loop_var != $stop ; ++ $loop_var ) { /* body */ }انظر أيضاً
مراجع
- 1 2 يارميش، غافرييل؛ كوبيك، داني (2007). "مراجعة أخطاء المبرمجين المبتدئين" . نشرة ACM SIGCSE . 39 (2). acm.org: 131–137 . doi : 10.1145/1272848.1272896 . S2CID 8854303. تاريخ الاسترجاع: 2008-06-04 .
- ↑ "بناء صفحات ويب ASP.NET ديناميكيًا في الكود الخلفي" . codeproject.com. 25 أبريل 2008. تم الاطلاع عليه بتاريخ 4 يونيو 2008 .
- ↑ سبينليس، ديوميديس. "دليل اكتشاف التعليمات البرمجية السيئة" . InformIT.com . تم الاطلاع عليه بتاريخ 2008-06-06 .
- ↑ ليويلين، ريموند. "أربعة مبادئ رئيسية للبرمجة الكائنية التوجه" . codebetter.com. مؤرشف من الأصل بتاريخ 25 نوفمبر 2010. تم الاطلاع عليه بتاريخ 4 يونيو 2008 .
- ↑ إريكسن، ليزا. "إعادة استخدام الكود في تطوير البرمجيات الموجهة للكائنات" (ملف PDF) . الجامعة النرويجية للعلوم والتكنولوجيا، قسم علوم الحاسوب والمعلومات . تاريخ الاسترجاع: 29-05-2008 .
- ↑ آشلي مارش. "معايير البرمجة - الطريق إلى كود قابل للصيانة" . شركة MAAN Softwares INC . تم الاطلاع عليه بتاريخ 10 أبريل 2018 .
- ↑ "جامعة ستانفورد، CS 106X ("مفاهيم البرمجة المجردة") نشرة المقرر الدراسي: "التفكيك"( ملف PDF) . جامعة ستانفورد. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 16 مايو 2008. تم الاطلاع عليه بتاريخ 4 يونيو 2008 .
روابط خارجية
- ج2: برمجة النسخ واللصق
- أندريه كاربوف. عواقب استخدام أسلوب النسخ واللصق في برمجة لغة C++ وكيفية التعامل معها
- أندريه كاربوف. تأثير السطر الأخير
- كاشف النسخ/اللصق من PMD ، CPD.
- برمجة الحاسوب
