شفرة سباغيتي

وصف الصورة
معكرونة إسباغيتي مطبوخة، متشابكة بشكل مميز

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

نظرًا لأن منطق التحكم في التدفق المُشفّر باستخدام عبارة goto غالبًا ما يؤدي إلى تدفق تحكم معقد، فإن استخدام goto يرتبط عادةً بتصنيف الكود على أنه كود معقد وغير منظم (spaghetti code). [ 2 ] وقد صُممت ممارسة البرمجة الهيكلية للتخلص من الحاجة إلى عبارة goto واستخدامها كإحدى طرق تجنب إنتاج كود معقد وغير منظم. إن ضمان إنشاء برمجيات عالية الجودة ، بدلاً من الكود المعقد وغير المنظم، غالبًا ما يتضمن جوانب مثل استخدام أدوات أفضل ، وتدريب المطورين، وتحسين عمليات تطوير البرمجيات . [ 3 ]

يمكن أن يصف مصطلح "كود السباغيتي" نمطًا برمجيًا سيئًا ، حيث يُكتب الكود البرمجي الموجه للكائنات بأسلوب إجرائي، كإنشاء فئات ذات توابع طويلة ومعقدة للغاية، أو التخلي عن مفاهيم البرمجة الموجهة للكائنات مثل تعدد الأشكال . [ 4 ] ويمكن أن يؤدي وجود هذا النوع من كود السباغيتي إلى تقليل قابلية فهم النظام بشكل كبير. [ 5 ]

تاريخ

من غير الواضح متى ظهر مصطلح " كود السباغيتي ". أشار مارتن هوبكنز إلى السباغيتي في هذا السياق عام 1972، حيث كتب أن "الدافع الرئيسي وراء حذف عبارة goto هو الأمل في ألا تبدو البرامج الناتجة كطبق من السباغيتي". [ 6 ] في كتابه "مقدمة في البرمجة المنضبطة باستخدام PL/I وPL/CS وPL/CT" الصادر عام 1978 ، وصف ريتشارد كونواي برامج "تتمتع بنفس البنية المنطقية النظيفة لطبق السباغيتي"، [ 7 ] وهي عبارة تكررت في كتابه " مقدمة في البرمجة" الصادر عام 1979 والذي شارك في تأليفه مع ديفيد غريس . [ 8 ] في ورقة بحثية بعنوان "نموذج حلزوني لتطوير البرمجيات وتحسينها" نُشرت عام 1988 ، استُخدم المصطلح لوصف الممارسة القديمة لنموذج "البرمجة والإصلاح" ، الذي افتقر إلى التخطيط وأدى في النهاية إلى تطوير نموذج الشلال . [ 9 ] في كتاب "البرمجة المهيكلة لمبرمجي كوبول" الصادر عام 1979 ، يستخدم المؤلف بول نول عبارتي " شفرة السباغيتي" و "عش الفئران" كمرادفين لوصف شفرة المصدر سيئة الهيكلة. [ 10 ]

في مؤتمر Ada – Europe '93 ، وُصفت لغة Ada بأنها تجبر المبرمج على "إنتاج كود مفهوم، بدلاً من كود معقد وغير منظم"، وذلك بسبب آلية انتشار الاستثناءات المقيدة فيها. [ 11 ]

في منشور صدر عام 1980 عن المكتب الوطني الأمريكي للمعايير ، تم استخدام عبارة " برنامج سباغيتي " لوصف البرامج القديمة التي تحتوي على "ملفات مجزأة ومتناثرة". [ 12 ]

في مقال ساخر عن لغات البرمجة نُشر عام 1981 في مجلة " ذا ميشيغان تكنيك " بعنوان "باختصار... بايتات فورتران!!"، وصف المؤلف لغة فورتران قائلاً إنها "تتكون بالكامل من شفرة معقدة وغير منظمة". [ 13 ]

وصف ريتشارد هامينغ في محاضراته [ 14 ] أصل المصطلح في سياق البرمجة المبكرة باستخدام الرموز الثنائية:

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

أمثلة

بسيط

يُعدّ كود BASIC التالي ، وهو برنامج يطبع الأرقام من 1 إلى 100، مثالًا بسيطًا نسبيًا على كود يسهل فهمه باستخدام تدفق تحكم منظم بدلًا من استخدام عبارة goto. GOTOيؤدي استخدام حلقة for وعدم وجود مسافة بادئة إلى تدفق منطقي غير واضح.

10 i = 0 20 i = i + 1 30 اطبع i 40 إذا كان i >= 100 ، فانتقل إلى 60 50 انتقل إلى 20 60 نهاية

ينتج الكود التالي نفس النتيجة، ولكنه يستخدم عبارة حلقة منظمة ومسافة بادئة لتحسين قابلية القراءة.

10 FOR i = 1 TO 100 20 PRINT i 30 NEXT i 40 END

أكثر تمثيلاً

ينفذ الكود التالي خوارزمية فرز رقمي . يؤدي استخدام عبارات goto إلى تعقيد تدفق التحكم بشكل كبير.

أدخل "كم عدد الأرقام التي يجب فرزها؟" ؛ T DIM n ( T ) FOR i = 1 TO T PRINT "الرقم:" ; i INPUT n ( i ) NEXT i 'الحسابات: C = T E180: C = INT ( C / 2 ) IF C = 0 THEN GOTO C330 D = T - C E = 1 I220: f = E F230: g = f + C IF n ( f ) > n ( g ) THEN SWAP n ( f ), n ( g ) f = f - C IF f > 0 THEN GOTO F230 E = E + 1 IF E > D THEN GOTO E180 GOTO I220 C330: PRINT "القائمة المرتبة هي" FOR i = 1 TO T PRINT n ( i ) NEXT i

كرة كبيرة من الطين

يُطلق مصطلح "كرة الطين الكبيرة" على نظام برمجي يفتقر إلى بنية واضحة. ورغم أنه غير مرغوب فيه من وجهة نظر هندسة البرمجيات، إلا أن هذه الأنظمة شائعة في الواقع العملي بسبب ضغوط الأعمال، ودوران المطورين ، وتدهور البرمجيات . وقد شاع استخدام هذا المصطلح بفضل برايان فوت وجوزيف يودر، مع أن الفضل في صياغته يعود إلى برايان ماريك. [ 15 ]

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

ربما لم يتم تحديد البنية العامة للنظام بشكل جيد على الإطلاق.

لو كان الأمر كذلك، لربما تآكل لدرجة يصعب معها التعرف عليه. يتجنب المبرمجون الذين يتمتعون بحس معماري ولو ضئيل هذه المستنقعات. فقط أولئك الذين لا يكترثون بالهندسة المعمارية، وربما يتقبلون روتين العمل اليومي المتمثل في ترقيع الثغرات في هذه السدود المتداعية، هم من يرضون بالعمل على مثل هذه الأنظمة.

برايان فوت وجوزيف يودر، كرة الطين الكبيرة. المؤتمر الرابع حول أنماط لغات البرامج (PLoP '97/EuroPLoP '97)، مونتيسيلو، إلينوي، سبتمبر 1997

استلهاماً من شعبية مصطلح "كود السباغيتي" ، تشمل المصطلحات الأخرى ذات الصلة بالمعكرونة والتي تصف الطبيعة الهيكلية للكود ما يلي:

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

انظر أيضاً

مراجع

  1. هورستمان، كاي (2008). "الفصل 6 - التكرار" . مفاهيم جافا لعلوم الحاسوب المتقدمة (الطبعة الخامسة [أي الطبعة الثانية]  ). هوبوكين، نيوجيرسي: جون وايلي وأولاده. الصفحات 235-236 . ISBN  978-0-470-18160-7تم الاطلاع عليه بتاريخ 2 يناير 2017 .
  2. كرام، ديفيد؛ هيدلي، بول (2005). "الضمائر والمعنى الإجرائي: أهمية الشفرة المعقدة والوهم البارانوي" (ملف PDF) . أوراق عمل جامعة أكسفورد في اللغويات وفقه اللغة وعلم الصوتيات . 10 : 187-210 . مؤرشف من الأصل (ملف PDF) في 6 مارس 2018. تم الاطلاع عليه في 5 مارس 2018 .
  3. ماركوس، بيزكا (2004). "تبسيط الشيفرة المعقدة بإعادة هيكلتها؟" (ملف PDF) . مجلة أبحاث وممارسات هندسة البرمجيات : 846-852 . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 5 مارس 2018. تم الاطلاع عليه بتاريخ 5 مارس 2018 .
  4. موها، ن.؛ غيهينيوك، ي. ج.؛ دوشين، ل.؛ مير، أ. ف. لو (يناير 2010). "ديكور: منهجية لتحديد وكشف عيوب التصميم والبرمجيات". مجلة IEEE للمعاملات في هندسة البرمجيات . 36 (1): 20-36 . Bibcode : 2010ITSEn..36...20M . CiteSeerX : 10.1.1.156.1524 . doi : 10.1109/TSE.2009.50 . ISSN: 0098-5589 . S2CID: 14767901 .   
  5. عباس، م.؛ خوم، ف.؛ غيهينيوك، ي. ج.؛ أنطونيول، ج. (2011). "دراسة تجريبية لتأثير نمطين مضادين، وهما نمط Blob ونمط Spaghetti Code، على فهم البرنامج". المؤتمر الأوروبي الخامس عشر لصيانة البرمجيات وإعادة هندستها ، 2011. الصفحات 181-190 . CiteSeerX 10.1.1.294.1685 . doi : 10.1109/CSMR.2011.24 . ISBN   978-1-61284-259-2. S2CID 14152638 . 
  6. هوبكنز، م. إ. (1972): حالة استخدام GOTO. في: وقائع مؤتمر ACM السنوي لعام 1972 - المجلد 2، أغسطس 1972، الصفحات 787-790، الصفحة 59. DOI: https://dl.acm.org/doi/10.1145/800194.805860
  7. كونواي، ريتشارد (1978). مدخل إلى البرمجة المنضبطة باستخدام لغات PL/I وPL/CS وPL/CT . دار نشر وينثروب. رقم ISBN 978-0-87626-712-7.
  8. كونواي، ريتشارد؛ غريس، ديفيد (1979). مقدمة في البرمجة ( الطبعة الثالثة). ليتل، براون. ISBN  978-0-316-15414-7.
  9. بوهم، باري و. (مايو 1988). "نموذج حلزوني لتطوير البرمجيات وتحسينها". مجلة IEEE Computer . 21 (2): 61-72 . Bibcode : 1988Compr..21e..61B . doi : 10.1109/2.59 . S2CID 1781829 . 
  10. نول، بول (1977). البرمجة الهيكلية لمبرمج كوبول: التصميم، والتوثيق، والترميز، والاختبار . م. موراش وشركاه.
  11. شفيل، يورغن (1993). "استخدام الاستثناءات وإساءة استخدامها - 12 إرشادات للتعامل السليم مع الاستثناءات". سلسلة محاضرات في علوم الحاسوب . آدا - أوروبا 93 (وقائع). سلسلة محاضرات في علوم الحاسوب. المجلد 688. سبرينغر برلين هايدلبرغ. الصفحات 142-152 . doi : 10.1007/3-540-56802-6_12 . ISBN   978-3-540-56802-5.
  12. المكتب الوطني الأمريكي للمعايير (1980). منشور فني خاص من الجمعية الأمريكية لاختبار المواد . مكتب الطباعة الحكومي الأمريكي.
  13. MTSBS (مارس - أبريل 1981). "باختصار... بايتات فورتران!!". مجلة ميشيغان التقنية . 99 (4).{{cite journal}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) صيانة CS1: أسماء رقمية: قائمة المؤلفين ( رابط )
  14. هامينغ، ريتشارد (1996). فن ممارسة العلوم والهندسة . تايلور وفرانسيس. ISBN 9056995006.
  15. فوت، برايان؛ يودر، جوزيف (26 يونيو 1999). "كرة طينية كبيرة" . laputan.org . تم الاطلاع عليه بتاريخ 14 أبريل 2019 .
  16. توموف، لاتشيزار؛ إيفانوفا، فالنتينا (أكتوبر 2014). "تدريس الممارسات الجيدة في هندسة البرمجيات من خلال الأمثلة المضادة" . علوم الحاسوب والتعليم في علوم الحاسوب (1): 397-405 . تم الاطلاع عليه في 5 مارس 2018 .
  17. دي تروير، أو. (13 مايو 1991). أندرسن، رودولف؛ بوبينكو، يانيس أ.؛ سولفبيرغ، آرني (محررون). نموذج العلاقة الثنائية الموجهة للكائنات : نموذج مفاهيمي موجه للكائنات حقًا (ملف PDF) . هندسة نظم المعلومات المتقدمة. ملاحظات حول ميكانيكا الموائع العددية والتصميم متعدد التخصصات. المجلد 498. الصفحات 561-578 . doi : 10.1007/3-540-54059-8_104 . ISBN    978-3-319-98176-5. S2CID 10894568 .