كود السباغيتي.
شيفرة مصدرية للبرامج بنية رديئة
كود السباغيتي (Spaghetti code) هو شيفرة مصدرية حاسوبية تُشفِّر تدفق التحكم بشكل متشابك ومعقد، مما يجعلها عسيرة الفهم. تُوجِّه تعليمات التحكم تنفيذ البرنامج بطرق تجعله بدلاً من أن يتميز بالبنية الجيدة يشبه السباغيتي المطبوخ، ملتوياً ومتشابكاً. يميل هذا الكود إلى صعوبة الصيانة.
نظراً لأن منطق تدفق التحكم المُشفَّر عبر تعليمة goto يميل إلى التعقيد، فإن استخدام goto كثيراً ما يُقرَن بتصنيف الكود ضمن كود السباغيتي. كانت ممارسة البرمجة المنظمة تهدف إلى القضاء على الحاجة إلى استخدام تعليمة goto باعتبارها إحدى وسائل تجنب إنتاج كود السباغيتي. كثيراً ما يستلزم ضمان إنتاج برمجيات عالية الجودة بدلاً من كود السباغيتي جوانب مثل استخدام أدوات أفضل وتدريب المطورين وتحسين عمليات تطوير البرمجيات.
يمكن أن يصف كود السباغيتي أيضاً نمطاً مضاداً يُكتب فيه الكود الكائني التوجه بأسلوب إجرائي، مثل إنشاء فئات ذات توابع طويلة جداً وفوضوية، أو التخلي عن مفاهيم البرمجة الكائنية كـتعددية الأشكال. يمكن أن يقلل وجود هذا الشكل من كود السباغيتي من قابلية فهم النظام تقليلاً ملحوظاً.
التاريخ
يظل توقيت ظهور مصطلح كود السباغيتي غير محدد. أشار Martin Hopkins إشارةً مبكرة إلى السباغيتي في هذا السياق عام 1972، إذ كتب أن "الدافع الرئيسي وراء حذف تعليمة goto هو الأمل في أن البرامج الناتجة لن تبدو كوعاء من السباغيتي." وفي كتاب عام 1978 بعنوان A primer on disciplined programming using PL/I, PL/CS, and PL/CT، وصف Richard Conway برامج "لها البنية المنطقية الأنيقة ذاتها التي لطبق سباغيتي"، وهو وصف تكرَّر في كتاب عام 1979 بعنوان An Introduction to Programming الذي شارك في تأليفه مع David Gries. وفي ورقة بحثية عام 1988 بعنوان A spiral model of software development and enhancement، استُخدم المصطلح لوصف الممارسة القديمة لـنموذج الكود والإصلاح، الذي افتقر إلى التخطيط وأفضى في نهاية المطاف إلى تطوير نموذج الشلال. وفي كتاب عام 1979 بعنوان Structured programming for the COBOL programmer، استخدم المؤلف Paul Noll مصطلحَي كود السباغيتي وعش الفئران مترادفَين لوصف الشيفرة المصدرية ذات البنية الرديئة.
في مؤتمر Ada – Europe '93، وُصفت لغة Ada بأنها تُلزم المبرمج بـ"إنتاج كود مفهوم بدلاً من كود السباغيتي"، وذلك بسبب آلية انتشار الاستثناءات المقيِّدة فيها.
في منشور عام 1980 صادر عن المكتب الوطني للمعايير الأمريكي، استُخدم مصطلح برنامج السباغيتي لوصف البرامج القديمة ذات "الملفات المجزأة والمتناثرة".
في مقلب لغات الحاسوب عام 1981 في مجلة The Michigan Technic بعنوان "BASICally speaking...FORTRAN bytes!!"، وصف المؤلف لغة FORTRAN قائلاً إنها "تتكون كلياً من كود السباغيتي".
وصف Richard Hamming في محاضراته اشتقاق المصطلح في سياق البرمجة المبكرة بالشيفرة الثنائية:
إذا أردت، أثناء إصلاح خطأ، إدراج تعليمات سُهي عنها، كنت تأخذ التعليمة السابقة مباشرةً وتستبدلها بتحويل إلى منطقة فارغة. هناك كنت تضع التعليمة التي كتبتها للتو فوق السابقة، وتُضيف التعليمات التي تريد إدراجها، ثم تتبعها بتحويل إلى البرنامج الرئيسي. وهكذا سرعان ما أصبح البرنامج سلسلة من قفزات التحكم إلى أماكن غريبة. وحين كانت تظهر أخطاء في التصحيحات كما يحدث دائماً تقريباً، كنت تستخدم الحيلة ذاتها مجدداً في منطقة متاحة أخرى. ونتيجةً لذلك سرعان ما اكتسب مسار التحكم في البرنامج عبر الذاكرة مظهر علبة سباغيتي. لماذا لا تُدرجها في تسلسل التعليمات مباشرةً؟ لأنك حينئذٍ ستضطر إلى مراجعة البرنامج بأكمله وتغيير جميع العناوين التي تُشير إلى أي من التعليمات المُحرَّكة! أي شيء ما عدا ذلك!
أمثلة
بسيط
الشيفرة التالية بلغة BASIC، وهي برنامج يطبع الأعداد من 1 إلى 100، مثالٌ بسيط نسبياً على شيفرة يمكن فهمها بصورة أيسر باستخدام تدفق تحكم منظم بدلاً من goto. يؤدي استخدام GOTO للتكرار وغياب المسافات البادئة إلى تدفق منطق أقل وضوحاً.
1 i=0
2 i=i+1
3 PRINT i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 END
تُنتج الشيفرة التالية النتيجة ذاتها، لكنها تستخدم تعليمة حلقة منظمة ومسافات بادئة لتحسين قابلية القراءة.
1 FOR i=1 TO 100
2 PRINT i
3 NEXT i
4 END
أكثر تمثيلاً
تُنفِّذ الشيفرة التالية خوارزمية فرز عددي. يؤدي استخدام تعليمات goto إلى طابع يشبه السباغيتي في تدفق التحكم.
INPUT "How many numbers should be sorted? "; T
DIM n(T)
FOR i = 1 TO T
PRINT "NUMBER:"; 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 "The sorted list is"
FOR i = 1 TO T
PRINT n(i)
NEXT i
ذو صلة
كرة الطين الكبيرة
كرة الطين الكبيرة (Big ball of mud) هي نظام برمجي يفتقر إلى بنية قابلة للإدراك. وعلى الرغم من كونها غير مرغوب فيها من منظور هندسة البرمجيات، فإن مثل هذه الأنظمة شائعة في الممارسة الفعلية بسبب الضغوط التجارية ودوران المطورين وإنتروبيا البرمجيات. شاع المصطلح على يد Brian Foote وJoseph Yoder، وإن كانا ينسبان صياغته إلى Brian Marick.
كرة الطين الكبيرة هي غابة من كود السباغيتي المُهيكَل بشكل عشوائي، الممتدة والمبعثرة والفوضوية، المثبَّتة بالشريط اللاصق وأسلاك الربط. تُظهر هذه الأنظمة علامات لا لبس فيها على النمو غير المُنضبَط والإصلاح المتكرر المؤقت. تُتشارَك المعلومات بلا ضابط بين العناصر البعيدة في النظام، حتى تكاد جميع المعلومات المهمة تصبح عامة أو مكررة.
قد لا تكون البنية الكلية للنظام قد حُدِّدت بشكل جيد قط.
وإن كانت، فقد تآكلت حتى باتت لا يمكن التعرف عليها. يتجنب المبرمجون ذوو الحس المعماري هذه المستنقعات. أولئك الذين لا يهتمون بالهندسة المعمارية فحسب، وربما يرتاحون لجمود المهمة اليومية في سد ثغرات هذه السدود المتداعية، هم من يرضون بالعمل في مثل هذه الأنظمة.
— Brian Foote وJoseph Yoder، Big Ball of Mud. المؤتمر الرابع للغات أنماط البرامج (PLoP '97/EuroPLoP '97) مونتيتشلو، إيلينوي، سبتمبر 1997
مصطلحات ذات صلة بالمعكرونة
استلهاماً من شهرة مصطلح كود السباغيتي، ظهرت مصطلحات أخرى مستوحاة من المعكرونة لوصف الطبيعة البنيوية للشيفرة، منها: