کد اسپاگتی
کد اسپاگتی یک عبارت تحقیرآمیز برای کد منبعی است که نگهداری آن دشوار و بدون ساختار است. کد اسپاگتی میتواند به دلایل متعددی ایجاد شود، مانند نیازهای ناپایدار پروژه، عدم وجود قوانین سبک برنامهنویسی، و مهندسان نرمافزار با توانایی یا تجربه ناکافی.[۱]
تعریف
[ویرایش]کدی که به جای استفاده از ساختارهای برنامهنویسی ساختیافته، از دستورهای GOTO بیش از حد استفاده میکند، منجر به برنامههای پیچیده و غیرقابل نگهداری میشود که اغلب به عنوان کد اسپاگتی شناخته میشوند.[۲] چنین کدی دارای ساختار کنترلی پیچیده و درهمپیچیده است، که جریان برنامه را به صورت مفهومی مانند یک کاسه اسپاگتی، پیچخورده و درهم نشان میدهد..[۳]
در یک انتشار در سال ۱۹۸۰ توسط اداره ملی استانداردهای ایالات متحده، عبارت برنامه اسپاگتی برای توصیف برنامههای قدیمی که دارای "فایلهای تکهتکه و پراکنده" بودند استفاده شده است.[۴]
کد اسپاگتی همچنین میتواند به یک الگوی ضد در کد شیءگرا اشاره کند که به سبک رویهای نوشته شده است، مانند ایجاد کلاسهایی که متدهای آنها بیش از حد طولانی و بینظم هستند، یا مفاهیم شیءگرایی مانند چندریختی را کنار میگذارند.[۵] وجود این نوع کد اسپاگتی میتواند بهطور قابلتوجهی از درک یک سیستم بکاهد.[۶]
تاریخچه
[ویرایش]هنوز مشخص نیست که عبارت کد اسپاگتی از چه زمانی به صورت رایج درآمده است؛ با این حال، چندین مرجع در سال ۱۹۷۷ ظاهر شدند، از جمله "ماکارونی بهتر از اسپاگتی است" نوشته گای استیل.[۷] در کتاب سال ۱۹۷۸ با عنوان "مقدمهای بر برنامهنویسی منظم با استفاده از PL/I، PL/CS و PL/CT"، ریچارد کانوی برنامههایی را توصیف میکند که "همان ساختار منطقی تمیز یک بشقاب اسپاگتی را دارند"،[۸] عبارتی که در کتاب سال ۱۹۷۹ "مقدمهای بر برنامهنویسی" که با دیوید گریز همنویسنده بود، تکرار شد.[۹] در مقاله ۱۹۸۸ با عنوان "مدل مارپیچی توسعه و بهبود نرمافزار"، این اصطلاح برای توصیف روش قدیمی کد و فیکس که بدون برنامهریزی بود و در نهایت منجر به توسعه مدل آبشار شد، استفاده شده است.[۱۰] در کتاب سال ۱۹۷۹ "برنامهنویسی ساختیافته برای برنامهنویس COBOL"، نویسنده پاول نول از عبارات کد اسپاگتی و لانه موش به عنوان مترادفهایی برای توصیف کد منبع ضعیف ساختیافته استفاده کرده است.[۱۱]
در کنفرانس Ada – Europe '93، زبان Ada به این دلیل توصیف شد که برنامهنویس را مجبور به "تولید کد قابل درک، به جای کد اسپاگتی" میکند، به دلیل مکانیزم محدود کننده انتشار استثناهای آن.[۱۲]
در یک مقاله هجو زبانهای برنامهنویسی در سال ۱۹۸۱ در The Michigan Technic با عنوان "BASICally speaking...FORTRAN bytes!!"، نویسنده FORTRAN را اینگونه توصیف کرد که "کاملاً از کد اسپاگتی تشکیل شده است".[۱۳]
ریچارد همینگ در سخنرانیهای خود[۱۴] ریشهشناسی این اصطلاح را در زمینه برنامهنویسی اولیه با کدهای باینری توصیف کرده است:
اگر هنگام اصلاح یک خطا، میخواستید دستورهایی که جا افتاده بودند را اضافه کنید، دستور چند لحظه قبل را گرفته و آن را با یک انتقال به فضای خالی جایگزین میکردید. در آنجا دستورهایی را که تازه نوشته بودید قرار میدادید، دستورهایی که میخواستید اضافه کنید را میافزودید، و سپس با یک انتقال به برنامه اصلی برمیگشتید. به این ترتیب، برنامه به زودی به یک رشته پرشهای کنترل به مکانهای عجیب تبدیل میشد. وقتی، همانطور که تقریباً همیشه اتفاق میافتد، در اصلاحات خطاهایی وجود داشت، دوباره از همان ترفند بهره میبردید و از فضای خالی دیگری استفاده میکردید. در نتیجه مسیر کنترل برنامه در طول ذخیرهسازی به زودی ظاهر یک قوطی اسپاگتی را به خود میگرفت. چرا به سادگی آنها را در مسیر دستورها قرار ندهیم؟ زیرا در این صورت مجبور بودید کل برنامه را مرور کرده و تمامی آدرسهایی که به هر یک از دستورهای جابجا شده اشاره دارند را تغییر دهید! هر چیزی به جز این!
عبارات مرتبط
[ویرایش]کد راویولی
[ویرایش]کد راویولی اصطلاحی مختص برنامهنویسی شیءگرا است. این اصطلاح کدی را توصیف میکند که از کلاسهای به خوبی ساختار یافته تشکیل شده است که به صورت جداگانه به راحتی قابل درک هستند، اما در مجموع فهم آنها دشوار است.[۱۵]
کد لازانیا
[ویرایش]کد لازانیا به کدی اشاره دارد که لایههای آن به قدری پیچیده و در هم تنیدهاند که ایجاد تغییر در یک لایه مستلزم تغییرات در تمامی لایههای دیگر است.[۱۶]
مثالها
[ویرایش]در زیر یک مثال ساده از کد اسپاگتی در BASIC آورده شده است. این برنامه هر یک از اعداد ۱ تا ۱۰۰ را به همراه مربع آنها روی صفحه نمایش چاپ میکند. تورفتگیها برای تمایز بین اقدامات مختلف انجام شده توسط کد استفاده نمیشوند، و دستورهای GOTO
برنامه باعث ایجاد وابستگی به شماره خطوط میشوند. جریان اجرای برنامه از یک قسمت به قسمت دیگر دشوارتر پیشبینی میشود. نمونههای واقعی کد اسپاگتی پیچیدهتر هستند و میتوانند بهطور قابل توجهی هزینههای نگهداری برنامه را افزایش دهند.
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
در اینجا همان کد به سبک برنامهنویسی ساختاریافته نوشته شده است:
1 FOR i=1 TO 100
2 PRINT i;"squared=";i*i
3 NEXT i
4 PRINT "Program Completed."
5 END
این برنامه از یک قسمت به قسمت دیگر پرش میکند، اما این پرشها رسمیتر و قابل پیشبینیتر هستند، زیرا حلقههای FOR و توابع کنترل جریان را فراهم میکنند، در حالی که دستور goto باعث ایجاد جریان کنترل دلخواه میشود. اگرچه این مثال کوچک است، برنامههای دنیای واقعی شامل خطوط زیادی از کد هستند و زمانی که به سبک کد اسپاگتی نوشته شوند، نگهداری آنها دشوار است.
در اینجا یک مثال دیگر از کد اسپاگتی با دستورهای 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
'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 خوشایند اما مبهم
- بدهی فنی
- عناصر سبک برنامهنویسی
منابع
[ویرایش]- ↑ Markus، Pizka (۲۰۰۴). «Straightening spaghetti-code with refactoring?» (PDF). Software Engineering Research and Practice: ۸۴۶–۸۵۲. بایگانیشده از اصلی (PDF) در ۵ مارس ۲۰۱۸. دریافتشده در ۵ مارس ۲۰۱۸.
- ↑ Cram، David؛ Hedley، Paul (۲۰۰۵). «Pronouns and procedural meaning: The relevance of spaghetti code and paranoid delusion» (PDF). Oxford University Working Papers in Linguistics, Philology and Phonetics. ۱۰: ۱۸۷–۲۱۰. بایگانیشده از اصلی (PDF) در ۶ مارس ۲۰۱۸. دریافتشده در ۵ مارس ۲۰۱۸.
- ↑ Horstmann, Cay (2008). "Chapter 6 - Iteration". Java Concepts for AP Computer Science (به انگلیسی) (5th ed. [i.e. 2nd ed.]. ed.). Hoboken, NJ: J. Wiley & Sons. pp. 235–236. ISBN 978-0-470-18160-7. Retrieved 2 January 2017.
- ↑ United States National Bureau of Standards (1980). ASTM special technical publication. United States Government Printing Office.
- ↑ Moha، N.؛ Gueheneuc، Y. G.؛ Duchien، L.؛ Meur، A. F. Le (ژانویه ۲۰۱۰). «DECOR: A Method for the Specification and Detection of Code and Design Smells». IEEE Transactions on Software Engineering. ۳۶ (۱): ۲۰–۳۶. CiteSeerX 10.1.1.156.1524. doi:10.1109/TSE.2009.50. شاپا 0098-5589.
- ↑ Abbes, M.; Khomh, F.; Gueheneuc, Y. G.; Antoniol, G. (2011). "An Empirical Study of the Impact of Two Antipatterns, Blob and Spaghetti Code, on Program Comprehension". 2011 15th European Conference on Software Maintenance and Reengineering. pp. 181–190. CiteSeerX 10.1.1.294.1685. doi:10.1109/CSMR.2011.24. ISBN 978-1-61284-259-2. S2CID 14152638.
- ↑ Guy Lewis Steele. 1977. Macaroni is better than spaghetti. In Proceedings of the 1977 symposium on Artificial intelligence and programming languages. Association for Computing Machinery, New York, NY, USA, 60–66. DOI:https://doi.org/10.1145/800228.806933
- ↑ Conway, Richard (1978). A primer on disciplined programming using PL/I, PL/CS, and PL/CT. Winthrop Publishers. ISBN 978-0-87626-712-7.
- ↑ Conway, Richard; Gries, David (1979). An Introduction to Programming (3rd ed.). Little, Brown. ISBN 978-0-316-15414-7.
- ↑ Boehm، Barry W. (مه ۱۹۸۸). «A spiral model of software development and enhancement». IEEE Computer. ۲۱ (۲): ۶۱–۷۲. doi:10.1109/2.59.
- ↑ Noll, Paul (1977). Structured programming for the COBOL programmer: design, documentation, coding, testing. M. Murach & Associates.
- ↑ Schwille, Jürgen (1993). "Use and abuse of exceptions — 12 guidelines for proper exception handling". Lecture Notes in Computer Science. Ada – Europe '93 (Proceedings). Lecture Notes in Computer Science. Vol. 688. Springer Berlin Heidelberg. pp. 142–152. doi:10.1007/3-540-56802-6_12. ISBN 978-3-540-56802-5.
- ↑ MTSBS[نیازمند شفافسازی] (مارس–آوریل ۱۹۸۱). «BASICally speaking...FORTRAN bytes!!». The Michigan Technic. ۹۹ (۴).
- ↑ Hamming, Richard (1996). The Art of Doing Science and Engineering. Taylor & Francis. ISBN 9056995006.
- ↑ De Troyer, O. (13 May 1991). Andersen, Rudolf; Bubenko, Janis A.; Sølvberg, Arne (eds.). The OO-binary relationship model : A truly object oriented conceptual model (PDF). Advanced Information Systems Engineering. Notes on Numerical Fluid Mechanics and Multidisciplinary Design (به انگلیسی). Vol. 498. pp. 561–578. doi:10.1007/3-540-54059-8_104. ISBN 978-3-319-98176-5. S2CID 10894568.
- ↑ Tomov، Latchezar؛ Ivanova، Valentina (اکتبر ۲۰۱۴). «Teaching Good Practices In Software Engineering by Counterexamples». Computer Science and Education in Computer Science (۱): ۳۹۷–۴۰۵. دریافتشده در ۵ مارس ۲۰۱۸.
پیوند به بیرون
[ویرایش]- 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 بایگانیشده در ۲۰۱۸-۰۷-۱۶ توسط Wayback Machine
- 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 بایگانیشده در ۲۰۲۳-۰۱-۲۱ توسط Wayback Machine
- Pasta Theory of Programming