---
title: "Código espaguete"
type: "antipattern"
slug: "spaghetti-code"
url: "http://localhost:3000/pt-br/antipatterns/spaghetti-code.md"
description: "Código-fonte de software com estrutura ruim"
---
# Código espaguete

> Código-fonte de software com estrutura ruim

**Código espaguete** é [código-fonte](https://en.wikipedia.org/wiki/Source%5Fcode "Source code") de [computador](https://en.wikipedia.org/wiki/Computer "Computer") que codifica um [fluxo de controle](https://en.wikipedia.org/wiki/Control%5Fflow "Control flow") confuso e, portanto, difícil de entender. As instruções de controle direcionam a [execução](https://en.wikipedia.org/wiki/Execution%5F%28computing%29 "Execution (computing)") do [programa](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") de maneiras que, em vez de possuir uma estrutura de qualidade, lembram [espaguete](https://en.wikipedia.org/wiki/Spaghetti "Spaghetti") cozido, torcido e emaranhado. O código tende a ser difícil de [manter](https://en.wikipedia.org/wiki/Software%5Fmaintenance "Software maintenance").

Como a lógica de fluxo de controle codificada por meio da instrução [goto](https://en.wikipedia.org/wiki/Goto "Goto") tende a levar a um fluxo de controle confuso, o uso do goto é frequentemente associado a uma classificação como código espaguete. A prática da [programação estruturada](https://en.wikipedia.org/wiki/Structured%5Fprogramming "Structured programming") foi concebida para eliminar a necessidade e o uso da instrução goto como uma forma de evitar a produção de código espaguete. Garantir a criação de [software](https://en.wikipedia.org/wiki/Software "Software") de alta qualidade, em vez de código espaguete, frequentemente envolve aspectos como usar [ferramentas](https://en.wikipedia.org/wiki/Software%5Ftool "Software tool") melhores, [treinar](https://en.wikipedia.org/wiki/Training "Training") desenvolvedores e melhorar os [processos de desenvolvimento de software](https://en.wikipedia.org/wiki/Software%5Fdevelopment%5Fprocess "Software development process").

Código espaguete também pode descrever um [antipadrão](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern") no qual [código orientado a objetos](https://en.wikipedia.org/wiki/Object-oriented%5Fprogramming "Object-oriented programming") é escrito em estilo procedural, como criar classes cujos métodos são excessivamente longos e desorganizados, ou abandonar conceitos de orientação a objetos como o [polimorfismo](https://en.wikipedia.org/wiki/Polymorphism%5F%28computer%5Fscience%29 "Polymorphism (computer science)"). A presença dessa forma de código espaguete pode reduzir significativamente a compreensibilidade de um sistema.

## História

Não está claro quando a expressão _código espaguete_ foi cunhada. Martin Hopkins fez uma referência inicial a espaguete nesse contexto em 1972, escrevendo que a "principal motivação por trás da eliminação da instrução goto é a esperança de que os programas resultantes não se pareçam com uma tigela de espaguete". No livro de 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") descreveu programas que "têm a mesma estrutura lógica limpa de um prato de espaguete", frase repetida no livro de 1979 _An Introduction to Programming_, que ele coescreveu com [David Gries](https://en.wikipedia.org/wiki/David%5FGries "David Gries"). No artigo de 1988 _A spiral model of software development and enhancement_, o termo é usado para descrever a antiga prática do _modelo de codificar e corrigir_, que carecia de planejamento e acabou levando ao desenvolvimento do [modelo em cascata](https://en.wikipedia.org/wiki/Waterfall%5Fmodel "Waterfall model"). No livro de 1979 _Structured programming for the COBOL programmer_, o autor Paul Noll usa as expressões _código espaguete_ e _ninho de rato_ como sinônimos para descrever código-fonte mal estruturado.

Na conferência _Ada – Europe '93_, [Ada](https://en.wikipedia.org/wiki/Ada%5F%28programming%5Flanguage%29 "Ada (programming language)") foi descrita como forçando o programador a "produzir código compreensível, em vez de código espaguete", por causa de seu mecanismo restritivo de propagação de exceções.

Em uma publicação de 1980 do [National Bureau of Standards dos Estados Unidos](https://en.wikipedia.org/wiki/National%5FInstitute%5Fof%5FStandards%5Fand%5FTechnology "National Institute of Standards and Technology"), a expressão _programa espaguete_ foi usada para descrever programas antigos que tinham "arquivos fragmentados e dispersos".

Em uma paródia sobre linguagens de programação de 1981 em _The Michigan Technic_, intitulada "BASICally speaking...FORTRAN bytes!!", o autor descreveu o [FORTRAN](https://en.wikipedia.org/wiki/FORTRAN "FORTRAN") afirmando que "ele consiste inteiramente em código espaguete".

[Richard Hamming](https://en.wikipedia.org/wiki/Richard%5FHamming "Richard Hamming") descreveu em suas palestras a etimologia do termo no contexto da programação inicial em códigos binários:

> Se, ao corrigir um erro, você quisesse inserir algumas instruções omitidas, então pegava a instrução imediatamente anterior e a substituía por um desvio para algum espaço vazio. Lá você colocava a instrução que acabara de sobrescrever, acrescentava as instruções que queria inserir e, em seguida, vinha um desvio de volta para o programa principal. Assim, o programa logo se tornava uma sequência de saltos do controle para lugares estranhos. Quando, como quase sempre acontece, havia erros nas correções, você usava o mesmo truque novamente, utilizando algum outro espaço disponível. Como resultado, _o caminho de controle do programa pela memória logo assumia a aparência de uma lata de espaguete._ Por que não simplesmente inseri-las na sequência de instruções? Porque então você teria que percorrer o programa inteiro e alterar todos os endereços que se referiam a quaisquer das instruções movidas! Tudo, menos isso!

## Exemplos

### Simples

O código [BASIC](https://en.wikipedia.org/wiki/BASIC "BASIC") a seguir, um programa que imprime de 1 a 100, é um exemplo relativamente simples de código que pode ser entendido mais facilmente com fluxo de controle estruturado em vez de usar goto. O uso de `GOTO` para laços e a falta de indentação levam a um fluxo lógico pouco claro.

1 i=0
2 i=i+1
3 PRINT i
4 IF i>=100 THEN GOTO 6
5 GOTO 2
6 END

O código a seguir produz o mesmo resultado, mas usa uma [instrução de laço](https://en.wikipedia.org/wiki/Loop%5F%28computing%29 "Loop (computing)") estruturada e indentação para melhorar a legibilidade.

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

### Mais representativo

O código a seguir implementa um [algoritmo de ordenação](https://en.wikipedia.org/wiki/Sorting%5Falgorithm "Sorting algorithm") numérico. O uso de instruções goto resulta em uma natureza semelhante a espaguete no fluxo de controle.

  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álculos:
  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

## Relacionados

### Grande bola de lama

Uma grande bola de lama é um [sistema de software](https://en.wikipedia.org/wiki/Software%5Fsystem "Software system") que carece de uma arquitetura perceptível. Embora indesejáveis do ponto de vista da engenharia de software, tais sistemas são comuns na prática devido a pressões de negócio, à [rotatividade](https://en.wikipedia.org/wiki/Turnover%5F%28employment%29 "Turnover (employment)") de desenvolvedores e à [entropia de software](https://en.wikipedia.org/wiki/Software%5Fentropy "Software entropy"). O termo foi popularizado por Brian Foote e Joseph Yoder, embora eles atribuam a Brian Marick a cunhagem do termo.

> Uma Grande Bola de Lama é uma selva de código espaguete estruturada ao acaso, espalhada, desleixada, montada com fita adesiva e arame. Esses sistemas mostram sinais inconfundíveis de crescimento não regulado e de reparos repetidos e improvisados. A informação é compartilhada promiscuamente entre elementos distantes do sistema, muitas vezes a ponto de quase toda a informação importante se tornar global ou duplicada.
>
> A estrutura geral do sistema pode nunca ter sido bem definida.
>
> Se foi, pode ter se erodido a ponto de ficar irreconhecível. Programadores com um mínimo de sensibilidade arquitetural evitam esses atoleiros. Apenas aqueles que não se importam com arquitetura e que, talvez, se sintam confortáveis com a inércia da tarefa cotidiana de tapar os buracos desses diques que cedem contentam-se em trabalhar em tais sistemas.

— Brian Foote e Joseph Yoder, _Big Ball of Mud._ Fourth Conference on Patterns Languages of Programs (PLoP '97/EuroPLoP '97) Monticello, Illinois, setembro de 1997

### Relacionados a massas

Inspirados pela popularidade do _código espaguete_, outros termos voltados a [massas](https://en.wikipedia.org/wiki/Pasta "Pasta") que descrevem a natureza estrutural do código incluem:

Código lasanha

O código [lasanha](https://en.wikipedia.org/wiki/Lasagna "Lasagna") tem [camadas](https://en.wikipedia.org/wiki/Architectural%5Flayer "Architectural layer") tão entrelaçadas que fazer uma alteração em uma camada exige alterar também outras camadas.

Código ravioli

O código [ravioli](https://en.wikipedia.org/wiki/Ravioli "Ravioli") é composto por [classes](https://en.wikipedia.org/wiki/Class%5F%28programming%29 "Class (programming)") bem estruturadas que são fáceis de entender isoladamente, mas que, em combinação, resultam em um design de sistema pouco claro.
