Spaghetti code explained

Spaghetti code is computer source code that encodes control flow that is convoluted, and therefore, hard to understand.Control statements direct program execution in ways that instead of having a quality of structure, resembles cooked spaghetti, twisted and tangled.[1] The code tends to be hard to maintain.

Since control flow logic encoded via the goto statement tends to lead to convoluted control flow, use of goto is often associated with a classification as spaghetti code.[2] The practice of structured programming was envisioned to eliminate the need for and use of the goto statement as one way to avoid the production of spaghetti code.Ensuring the creation of high-quality software, instead of spaghetti code, often involves aspects such as using better tools, training developers and improving software development processes.[3]

Spaghetti code can also describe an anti-pattern in which object-oriented code is written in a procedural style, such as by creating classes whose methods are overly long and messy, or forsaking object-oriented concepts like polymorphism.[4] The presence of this form of spaghetti code can significantly reduce the comprehensibility of a system.[5]

History

It is unclear when the phrase spaghetti code was coined. Martin Hopkins made an early reference to spaghetti in this context in 1972, writing that the "principal motivation behind eliminating the goto statement is the hope that the resulting programs will not look like a bowl of spaghetti."[6] In the 1978 book A primer on disciplined programming using PL/I, PL/CS, and PL/CT, Richard Conway described programs that "have the same clean logical structure as a plate of spaghetti",[7] a phrase repeated in the 1979 book An Introduction to Programming he co-authored with David Gries.[8] In the 1988 paper A spiral model of software development and enhancement, the term is used to describe the older practice of the code and fix model, which lacked planning and eventually led to the development of the waterfall model.[9] In the 1979 book Structured programming for the COBOL programmer, author Paul Noll uses the phrases spaghetti code and rat's nest as synonyms to describe poorly structured source code.[10]

In the Ada – Europe '93 conference, Ada was described as forcing the programmer to "produce understandable, instead of spaghetti code", because of its restrictive exception propagation mechanism.[11]

In a 1980 publication by the United States National Bureau of Standards, the phrase spaghetti program was used to describe older programs having "fragmented and scattered files".[12]

In a 1981 computer languages spoof in The Michigan Technic titled "BASICally speaking...FORTRAN bytes!!", the author described FORTRAN stating that "it consists entirely of spaghetti code".[13]

Richard Hamming described in his lectures[14] the etymology of the term in the context of early programming in binary codes:

Examples

Simple

The following BASIC code, a program that prints 1 to 100, is a relatively simple example of code that can be more easily understood with structured control flow instead of using goto. The use of for looping and lack of indentation leads to less than clear logic flow.

1 i=02 i=i+13 PRINT i4 IF i>=100 THEN GOTO 65 GOTO 26 END

The following code produces the same result, but uses a structured loop statement and indentation to improve readability.

1 FOR i=1 TO 1002 PRINT i3 NEXT i4 END

More representative

The following code implements a numeric sorting algorithm. The use of goto statements results in a spaghetti-like nature to the control flow.

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 = TE180: C = INT(C / 2) IF C = 0 THEN GOTO C330 D = T - C E = 1I220: f = EF230: 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 I220C330: PRINT "The sorted list is" FOR i = 1 TO T PRINT n(i) NEXT i

Related

Big ball of mud

A big ball of mud is a software system that lacks a perceivable architecture. Although undesirable from a software engineering point of view, such systems are common in practice due to business pressures, developer turnover and software entropy. The term was popularized by Brian Foote and Joseph Yoder although they credit Brian Marick for coining the term.[15]

Pasta-related

Inspired by the popularity of spaghetti code, other pasta-oriented terms that describe the structural nature of code include:

Lasagna code: Lasagna code has layers that are so intertwined that making a change in one layer necessitates changing other layers too.[16]
Ravioli code: Ravioli code comprises well-structured classes that are easy to understand in isolation but in combination result in less than clear system design.[17]

See also

External links

Notes and References

  1. Book: Horstmann. Cay. Java Concepts for AP Computer Science. 2008. J. Wiley & Sons. Hoboken, NJ. 978-0-470-18160-7. 235–236. 5th ed. [i.e. 2nd ed.].. http://horstmann.com/bigjava3.html. 2 January 2017. en. Chapter 6 - Iteration.
  2. Cram. David. Hedley. Paul. Pronouns and procedural meaning: The relevance of spaghetti code and paranoid delusion. Oxford University Working Papers in Linguistics, Philology and Phonetics. 2005. 10. 187–210. 5 March 2018. 6 March 2018. https://web.archive.org/web/20180306022905/http://mostlyharmless.org.uk/wp-content/uploads/2010/12/cramhedley-web.pdf. dead.
  3. Markus. Pizka. Straightening spaghetti-code with refactoring?. Software Engineering Research and Practice. 2004. 846–852. 5 March 2018. 5 March 2018. https://web.archive.org/web/20180305202716/http://itestra.com/wp-content/uploads/2017/08/04_itestra_straightening_spaghetti_code_with_refactoring.pdf. dead.
  4. 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. January 2010. 36. 1. 20–36. 10.1109/TSE.2009.50. 2010ITSEn..36...20M . 0098-5589. 10.1.1.156.1524. 14767901.
  5. Book: Abbes. M.. Khomh. F.. Gueheneuc. Y. G.. Antoniol. G.. 2011 15th European Conference on Software Maintenance and Reengineering . An Empirical Study of the Impact of Two Antipatterns, Blob and Spaghetti Code, on Program Comprehension . 2011. 181–190. 10.1109/CSMR.2011.24. 978-1-61284-259-2. 10.1.1.294.1685. 14152638.
  6. Hopkins, M. E. (1972): A Case fo the GOTO. In: ACM '72: Proceedings of the ACM annual conference - Volume 2, August 1972, pp 787–790, p 59 DOI:https://dl.acm.org/doi/10.1145/800194.805860
  7. Book: Conway, Richard. A primer on disciplined programming using PL/I, PL/CS, and PL/CT. Winthrop Publishers. 1978. 978-0-87626-712-7.
  8. Book: An Introduction to Programming. Conway. Richard. Gries. David. 3rd. Little, Brown. 1979. 978-0-316-15414-7.
  9. IEEE Computer. A spiral model of software development and enhancement. Boehm. Barry W.. 21. 2. May 1988. 61–72. 10.1109/2.59. 1988Compr..21e..61B . 1781829.
  10. Book: Noll, Paul. Structured programming for the COBOL programmer: design, documentation, coding, testing. M. Murach & Associates. 1977.
  11. Ada – Europe '93 (Proceedings). Lecture Notes in Computer Science. Use and abuse of exceptions — 12 guidelines for proper exception handling. Schwille. Jürgen . Lecture Notes in Computer Science . 688. 1993. Springer Berlin Heidelberg. 142–152. 10.1007/3-540-56802-6_12. 978-3-540-56802-5 .
  12. Book: ASTM special technical publication. 500–565. United States National Bureau of Standards. United States Government Printing Office. 1980.
  13. The Michigan Technic. BASICally speaking...FORTRAN bytes!!. MTSBS. 99. 4. March–April 1981.
  14. Book: Hamming . Richard . The Art of Doing Science and Engineering . 1996 . Taylor & Francis . 9056995006.
  15. Web site: Foote . Brian . Yoder . Joseph . Big Ball of Mud . laputan.org . 26 June 1999 . 14 April 2019.
  16. Tomov. Latchezar. Ivanova. Valentina. Teaching Good Practices In Software Engineering by Counterexamples. Computer Science and Education in Computer Science. October 2014. 1. 397–405. 5 March 2018.
  17. De Troyer. O.. The OO-binary relationship model : A truly object oriented conceptual model. Advanced Information Systems Engineering. 498. 13 May 1991. 561–578. 10.1007/3-540-54059-8_104. en. Notes on Numerical Fluid Mechanics and Multidisciplinary Design. 978-3-319-98176-5. 10894568 . Andersen . Rudolf. Bubenko . Janis A. . Sølvberg . Arne.