ConstructiCat Logo
CodeBust.
Browse section ▾

Código espaguete.

Código-fonte de software com estrutura ruim

Código espaguete é código-fonte de computador que codifica um fluxo de controle confuso e, portanto, difícil de entender. As instruções de controle direcionam a execução do programa de maneiras que, em vez de possuir uma estrutura de qualidade, lembram espaguete cozido, torcido e emaranhado. O código tende a ser difícil de manter.

Como a lógica de fluxo de controle codificada por meio da instrução 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 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 de alta qualidade, em vez de código espaguete, frequentemente envolve aspectos como usar ferramentas melhores, treinar desenvolvedores e melhorar os processos de desenvolvimento de software.

Código espaguete também pode descrever um antipadrão no qual código orientado a objetos é 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. 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 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. 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. 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 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, 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 afirmando que "ele consiste inteiramente em código espaguete".

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 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 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 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

Grande bola de lama

Uma grande bola de lama é um sistema de software 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 de desenvolvedores e à entropia de software. 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

Inspirados pela popularidade do código espaguete, outros termos voltados a massas que descrevem a natureza estrutural do código incluem:

Código lasanha
O código lasanha tem camadas 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 é composto por classes bem estruturadas que são fáceis de entender isoladamente, mas que, em combinação, resultam em um design de sistema pouco claro.