---
title: "كود السباغيتي"
type: "antipattern"
slug: "spaghetti-code"
url: "http://localhost:3000/ar/antipatterns/spaghetti-code.md"
description: "شيفرة مصدرية للبرامج بنية رديئة"
---
# كود السباغيتي

> شيفرة مصدرية للبرامج بنية رديئة

**كود السباغيتي** (Spaghetti code) هو [شيفرة مصدرية](https://en.wikipedia.org/wiki/Source%5Fcode "Source code") [حاسوبية](https://en.wikipedia.org/wiki/Computer "Computer") تُشفِّر [تدفق التحكم](https://en.wikipedia.org/wiki/Control%5Fflow "Control flow") بشكل متشابك ومعقد، مما يجعلها عسيرة الفهم. تُوجِّه تعليمات التحكم [تنفيذ](https://en.wikipedia.org/wiki/Execution%5F%28computing%29 "Execution (computing)") [البرنامج](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") بطرق تجعله بدلاً من أن يتميز بالبنية الجيدة يشبه [السباغيتي](https://en.wikipedia.org/wiki/Spaghetti "Spaghetti") المطبوخ، ملتوياً ومتشابكاً. يميل هذا الكود إلى صعوبة [الصيانة](https://en.wikipedia.org/wiki/Software%5Fmaintenance "Software maintenance").

نظراً لأن منطق تدفق التحكم المُشفَّر عبر تعليمة [goto](https://en.wikipedia.org/wiki/Goto "Goto") يميل إلى التعقيد، فإن استخدام goto كثيراً ما يُقرَن بتصنيف الكود ضمن كود السباغيتي. كانت ممارسة [البرمجة المنظمة](https://en.wikipedia.org/wiki/Structured%5Fprogramming "Structured programming") تهدف إلى القضاء على الحاجة إلى استخدام تعليمة goto باعتبارها إحدى وسائل تجنب إنتاج كود السباغيتي. كثيراً ما يستلزم ضمان إنتاج [برمجيات](https://en.wikipedia.org/wiki/Software "Software") عالية الجودة بدلاً من كود السباغيتي جوانب مثل استخدام [أدوات](https://en.wikipedia.org/wiki/Software%5Ftool "Software tool") أفضل و[تدريب](https://en.wikipedia.org/wiki/Training "Training") المطورين وتحسين [عمليات تطوير البرمجيات](https://en.wikipedia.org/wiki/Software%5Fdevelopment%5Fprocess "Software development process").

يمكن أن يصف كود السباغيتي أيضاً [نمطاً مضاداً](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") يُكتب فيه [الكود الكائني التوجه](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") بأسلوب إجرائي، مثل إنشاء فئات ذات توابع طويلة جداً وفوضوية، أو التخلي عن مفاهيم البرمجة الكائنية كـ[تعددية الأشكال](https://en.wikipedia.org/wiki/Polymorphism%5F%28computer%5Fscience%29 "Polymorphism (computer science)"). يمكن أن يقلل وجود هذا الشكل من كود السباغيتي من قابلية فهم النظام تقليلاً ملحوظاً.

## التاريخ

يظل توقيت ظهور مصطلح _كود السباغيتي_ غير محدد. أشار Martin Hopkins إشارةً مبكرة إلى السباغيتي في هذا السياق عام 1972، إذ كتب أن "الدافع الرئيسي وراء حذف تعليمة goto هو الأمل في أن البرامج الناتجة لن تبدو كوعاء من السباغيتي." وفي كتاب عام 1978 بعنوان _A primer on disciplined programming using PL/I, PL/CS, and PL/CT_، وصف [Richard Conway](https://en.wikipedia.org/wiki/Richard%5FW.%5FConway "Richard W. Conway") برامج "لها البنية المنطقية الأنيقة ذاتها التي لطبق سباغيتي"، وهو وصف تكرَّر في كتاب عام 1979 بعنوان _An Introduction to Programming_ الذي شارك في تأليفه مع [David Gries](https://en.wikipedia.org/wiki/David%5FGries "David Gries"). وفي ورقة بحثية عام 1988 بعنوان _A spiral model of software development and enhancement_، استُخدم المصطلح لوصف الممارسة القديمة لـ_نموذج الكود والإصلاح_، الذي افتقر إلى التخطيط وأفضى في نهاية المطاف إلى تطوير [نموذج الشلال](https://en.wikipedia.org/wiki/Waterfall%5Fmodel "Waterfall model"). وفي كتاب عام 1979 بعنوان _Structured programming for the COBOL programmer_، استخدم المؤلف Paul Noll مصطلحَي _كود السباغيتي_ و_عش الفئران_ مترادفَين لوصف الشيفرة المصدرية ذات البنية الرديئة.

في مؤتمر _Ada – Europe '93_، وُصفت لغة [Ada](https://en.wikipedia.org/wiki/Ada%5F%28programming%5Flanguage%29 "Ada (programming language)") بأنها تُلزم المبرمج بـ"إنتاج كود مفهوم بدلاً من كود السباغيتي"، وذلك بسبب آلية انتشار الاستثناءات المقيِّدة فيها.

في منشور عام 1980 صادر عن [المكتب الوطني للمعايير الأمريكي](https://en.wikipedia.org/wiki/National%5FInstitute%5Fof%5FStandards%5Fand%5FTechnology "National Institute of Standards and Technology")، استُخدم مصطلح _برنامج السباغيتي_ لوصف البرامج القديمة ذات "الملفات المجزأة والمتناثرة".

في مقلب لغات الحاسوب عام 1981 في مجلة _The Michigan Technic_ بعنوان "BASICally speaking...FORTRAN bytes!!"، وصف المؤلف لغة [FORTRAN](https://en.wikipedia.org/wiki/FORTRAN "FORTRAN") قائلاً إنها "تتكون كلياً من كود السباغيتي".

وصف [Richard Hamming](https://en.wikipedia.org/wiki/Richard%5FHamming "Richard Hamming") في محاضراته اشتقاق المصطلح في سياق البرمجة المبكرة بالشيفرة الثنائية:

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

## أمثلة

### بسيط

الشيفرة التالية بلغة [BASIC](https://en.wikipedia.org/wiki/BASIC "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

تُنتج الشيفرة التالية النتيجة ذاتها، لكنها تستخدم [تعليمة حلقة](https://en.wikipedia.org/wiki/Loop%5F%28computing%29 "Loop (computing)") منظمة ومسافات بادئة لتحسين قابلية القراءة.

1 FOR i=1 TO 100
2     PRINT i
3 NEXT i
4 END

### أكثر تمثيلاً

تُنفِّذ الشيفرة التالية [خوارزمية فرز](https://en.wikipedia.org/wiki/Sorting%5Falgorithm "Sorting algorithm") عددي. يؤدي استخدام تعليمات 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) هي [نظام برمجي](https://en.wikipedia.org/wiki/Software%5Fsystem "Software system") يفتقر إلى بنية قابلة للإدراك. وعلى الرغم من كونها غير مرغوب فيها من منظور هندسة البرمجيات، فإن مثل هذه الأنظمة شائعة في الممارسة الفعلية بسبب الضغوط التجارية و[دوران المطورين](https://en.wikipedia.org/wiki/Turnover%5F%28employment%29 "Turnover (employment)") و[إنتروبيا البرمجيات](https://en.wikipedia.org/wiki/Software%5Fentropy "Software entropy"). شاع المصطلح على يد Brian Foote وJoseph Yoder، وإن كانا ينسبان صياغته إلى Brian Marick.

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

— Brian Foote وJoseph Yoder، _Big Ball of Mud._ المؤتمر الرابع للغات أنماط البرامج (PLoP '97/EuroPLoP '97) مونتيتشلو، إيلينوي، سبتمبر 1997

### مصطلحات ذات صلة بالمعكرونة

استلهاماً من شهرة مصطلح _كود السباغيتي_، ظهرت مصطلحات أخرى مستوحاة من [المعكرونة](https://en.wikipedia.org/wiki/Pasta "Pasta") لوصف الطبيعة البنيوية للشيفرة، منها:

كود اللازانيا

تمتلك شيفرة [اللازانيا](https://en.wikipedia.org/wiki/Lasagna "Lasagna") [طبقات](https://en.wikipedia.org/wiki/Architectural%5Flayer "Architectural layer") متشابكة إلى حد يستلزم أن يستتبع التغيير في طبقة واحدة تغيير طبقات أخرى.

كود الرافيولي

يتألف كود [الرافيولي](https://en.wikipedia.org/wiki/Ravioli "Ravioli") من [فئات](https://en.wikipedia.org/wiki/Class%5F%28programming%29 "Class (programming)") مُهيكَلة بشكل جيد وسهلة الفهم منفردةً، لكنها مجتمعةً تُفضي إلى تصميم نظام أقل وضوحاً.
