کد اسپاگتی

بندانگشتی|کد اسپاگتی
**کد اسپاگتی** یک عبارت تحقیرآمیز برای کد منبعی است که نگهداری آن دشوار و بدون ساختار است. کد اسپاگتی می‌تواند به دلایل متعددی ایجاد شود، مانند نیازهای ناپایدار پروژه، عدم وجود قوانین سبک برنامه‌نویسی، و مهندسان نرم‌افزار با توانایی یا تجربه ناکافی.

## تعریف
کدی که به جای استفاده از ساختارهای برنامه‌نویسی ساخت‌یافته، از دستورهای Goto بیش از حد استفاده می‌کند، منجر به برنامه‌های پیچیده و غیرقابل نگهداری می‌شود که اغلب به عنوان کد اسپاگتی شناخته می‌شوند. چنین کدی دارای ساختار کنترلی پیچیده و درهم‌پیچیده است، که جریان برنامه را به صورت مفهومی مانند یک کاسه اسپاگتی، پیچ‌خورده و درهم نشان می‌دهد..

در یک انتشار در سال ۱۹۸۰ توسط اداره ملی استانداردهای ایالات متحده، عبارت *برنامه اسپاگتی* برای توصیف برنامه‌های قدیمی که دارای «فایل‌های تکه‌تکه و پراکنده» بودند استفاده شده است.

کد اسپاگتی همچنین می‌تواند به یک الگوی ضد در کد شیءگرا اشاره کند که به سبک رویه‌ای نوشته شده است، مانند ایجاد کلاس‌هایی که متدهای آن‌ها بیش از حد طولانی و بی‌نظم هستند، یا مفاهیم شیءگرایی مانند چندریختی را کنار می‌گذارند. وجود این نوع کد اسپاگتی می‌تواند به‌طور قابل‌توجهی از درک یک سیستم بکاهد.

## تاریخچه
هنوز مشخص نیست که عبارت کد اسپاگتی از چه زمانی به صورت رایج درآمده است؛ با این حال، چندین مرجع در سال ۱۹۷۷ ظاهر شدند، از جمله *"ماکارونی بهتر از اسپاگتی است"* نوشته گای استیل. در کتاب سال ۱۹۷۸ با عنوان *"مقدمه‌ای بر برنامه‌نویسی منظم با استفاده از PL/I, PL/CS و PL/CT"*, ریچارد کانوی برنامه‌هایی را توصیف می‌کند که "همان ساختار منطقی تمیز یک بشقاب اسپاگتی را دارند"، عبارتی که در کتاب سال ۱۹۷۹ *"مقدمه‌ای بر برنامه‌نویسی"* که با دیوید گریز هم‌نویسنده بود، تکرار شد. در مقاله ۱۹۸۸ با عنوان *"مدل مارپیچی توسعه و بهبود نرم‌افزار"*، این اصطلاح برای توصیف روش قدیمی *کد و فیکس* که بدون برنامه‌ریزی بود و در نهایت منجر به توسعه مدل آبشار شد، استفاده شده است. در کتاب سال ۱۹۷۹ *"برنامه‌نویسی ساخت‌یافته برای برنامه‌نویس COBOL"*، نویسنده پاول نول از عبارات *کد اسپاگتی* و *لانه موش* به عنوان مترادف‌هایی برای توصیف کد منبع ضعیف ساخت‌یافته استفاده کرده است.

در کنفرانس *Ada – Europe '93*، زبان Ada به این دلیل توصیف شد که برنامه‌نویس را مجبور به «تولید کد قابل درک، به جای کد اسپاگتی» می‌کند، به دلیل مکانیزم محدود کننده انتشار استثناهای آن.

در یک مقاله هجو زبان‌های برنامه‌نویسی در سال ۱۹۸۱ در The* Michigan Technic* با عنوان "BASICally speaking...FORTRAN bytes!!"، نویسنده FORTRAN را این‌گونه توصیف کرد که "کاملاً از کد اسپاگتی تشکیل شده است".

ریچارد همینگ در سخنرانی‌های خود ریشه‌شناسی این اصطلاح را در زمینه برنامه‌نویسی اولیه با کدهای باینری توصیف کرده است:

## عبارات مرتبط
### کد راویولی
کد راویولی اصطلاحی مختص برنامه‌نویسی شیءگرا است. این اصطلاح کدی را توصیف می‌کند که از کلاس‌های به خوبی ساختار یافته تشکیل شده است که به صورت جداگانه به راحتی قابل درک هستند، اما در مجموع فهم آنها دشوار است.

### کد لازانیا

کد لازانیا به کدی اشاره دارد که لایه‌های آن به قدری پیچیده و در هم تنیده‌اند که ایجاد تغییر در یک لایه مستلزم تغییرات در تمامی لایه‌های دیگر است.

## مثال‌ها
در زیر یک مثال ساده از کد اسپاگتی در BASIC آورده شده است. این برنامه هر یک از اعداد ۱ تا ۱۰۰ را به همراه مربع آن‌ها روی صفحه نمایش چاپ می‌کند. تورفتگی‌ها برای تمایز بین اقدامات مختلف انجام شده توسط کد استفاده نمی‌شوند، و دستورهای `[[Goto]]` برنامه باعث ایجاد وابستگی به شماره خطوط می‌شوند. جریان اجرای برنامه از یک قسمت به قسمت دیگر دشوارتر پیش‌بینی می‌شود. نمونه‌های واقعی کد اسپاگتی پیچیده‌تر هستند و می‌توانند به‌طور قابل توجهی هزینه‌های نگهداری برنامه را افزایش دهند.


```basic
1 i=0
2 i=i+1
3 PRINT i;"squared=";i*i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 PRINT "Program Completed."
7 END
```


در اینجا همان کد به سبک برنامه‌نویسی ساختاریافته نوشته شده است:


```basic
1 FOR i=1 TO 100
2     PRINT i;"squared=";i*i
3 NEXT i
4 PRINT "Program Completed."
5 END
```


این برنامه از یک قسمت به قسمت دیگر پرش می‌کند، اما این پرش‌ها رسمی‌تر و قابل پیش‌بینی‌تر هستند، زیرا حلقه‌های FOR و توابع کنترل جریان را فراهم می‌کنند، در حالی که دستور *goto* باعث ایجاد جریان کنترل دلخواه می‌شود. اگرچه این مثال کوچک است، برنامه‌های دنیای واقعی شامل خطوط زیادی از کد هستند و زمانی که به سبک کد اسپاگتی نوشته شوند، نگهداری آن‌ها دشوار است.

در اینجا یک مثال دیگر از کد اسپاگتی با دستورهای GOTO قرار دارد.

```basic
INPUT "How many numbers should be sorted? "; T
  DIM n(T)
  FOR i = 1 TO T
    PRINT "NUMBER:"; i
    INPUT n(i)
  NEXT i
  'Calculations:
  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
```


## جستارهای وابسته

* گلوله بزرگ گل، یک قطعه نرم‌افزار بدون معماری قابل درک
* مسابقه بین‌المللی کد مبهم C، رقابتی برای تولید کد C خوشایند اما مبهم
* بدهی فنی
* ''عناصر سبک برنامه‌نویسی''

## منابع

## پیوند به بیرون
* Go To Statement Considered Harmful. The classic repudiation of spaghetti code by Edsger Dijkstra
* ''We don't know where to GOTO if we don't know where we've COME FROM'' by R. Lawrence Clark from DATAMATION, December, 1973 
* Refactoring Java spaghetti code into Java bento code separating out a bowl full of code from one class into seven classes
* Objects and Frameworks – Taking a Step Back by Brian Rinaldi
* Programming Pasta - Spaghetti, Lasagna, Ravioli and Macaroni Code 
* Pasta Theory of Programming

رده:ضدالگوها
رده:فرهنگ مردمی مهندسی نرم‌افزار
رده:ناسزاهای مرتبط با فناوری