Spaghetti code
From Wikipedia, the free encyclopedia
Spaghetti code is a pejorative term for source code which has a complex and tangled control structure, especially one using many GOTOs, exceptions, threads, or other "unstructured" branching constructs. It is named such because program flow tends to look like a bowl of spaghetti, i.e. twisted and tangled. Structured programming greatly decreased the incidence of spaghetti code, and is widely regarded as one of the most important advances in programming history.
Contents |
[edit] Examples
Below is an example of what would be considered a trivial example of spaghetti code in BASIC. The program prints the numbers 1 to 10 to the screen along with their square. Notice that indentation is not needed and that the program's goto statements create a reliance on line numbers. Also observe the unpredictable way the flow of execution jumps from one area to another. Real-world occurrences of spaghetti code are more complex and can add greatly to a program's maintenance costs.
10 i = 0 20 i = i + 1 30 PRINT i; " squared = "; i * i 40 IF i < 10 THEN GOTO 20 50 PRINT "Program Completed." 60 END
Here is the same code written in a structured programming style:
FOR i = 1 TO 10 PRINT i; " squared = "; i * i NEXT i PRINT "Program Completed." END
The program jumps from one area to another but this jumping is predictable and formal. This is because using for loops and functions are standard ways of providing flow control whereas the goto statement encourages arbitrary flow control. Though this example is small, real world programs are composed of many lines of code and are difficult to maintain when written in a spaghetti code fashion.
[edit] Assembly and script languages
When using the many forms of assembly language (and also the underlying machine code) the danger of writing spaghetti code is especially great. This is because they are low-level programming languages where equivalents for structured control flow statements such as for loops and while loops seldom exist. Many scripting languages have the same deficiencies: this applies to the batch scripting language of DOS and DCL on VMS.
Nonetheless, adopting the same discipline as in structured programming can greatly improve the readability and maintainability of such code. This may take the form of conventions limiting the use of goto
to correspond to the standard structures, or use of a set of assembler macros for if
and loop
constructs. Most assembly languages also provide a function stack, and function call mechanisms which can be used to gain the advantages of procedural programming. Macros can again be used to support a standardized form of parameter passing, to avoid the accumulate and fire anti-pattern.
Programs written in higher-level languages with high-level constructs such as for loops (as in the second example above) are often compiled into assembly or machine code. When this process occurs, the high-level constructs are translated into low-level "spaghetti code" which may resemble the first example above in terms of control flow. But because compilers must be faithful to high-level constructs in the source code, the problems that plague relatively unstructured languages like BASIC do not haunt higher-level languages. It does, however, mean that debugging even mildly optimized code with a source-level debugger can be surprisingly confusing.
[edit] See also
- Structured programming Coding without
goto
, e.g. using only loop, sequence and alternate structures. - International Obfuscated C Code Contest A competition to produce pleasingly obscure C code.
- Ravioli code Code that uses many small and heavily interrelated objects.
- Lasagna code A type of program structure, characterized by several well-defined and separable layers, where each layer of code accesses services in the layers below through well-defined interfaces.
- Spaghetti with Meatballs (programming) Twisted, tangled and unstructured code (spaghetti), with objects (meatballs) thrown in for good measure.
[edit] References
This article was originally based on material from the Free On-line Dictionary of Computing, which is licensed under the GFDL.
This article or section needs sources or references that appear in reliable, third-party publications. Primary sources and sources affiliated with the subject of the article are generally not sufficient for a Wikipedia article. Please include more appropriate citations from reliable sources, or discuss the issue on the talk page. This article has been tagged since April 2007. |
[edit] External links
- 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