Identação é uma palavra que vem do inglês identation e significa, neste contexto, o alinhamento de comandos em colunas de acordo com o nível hierárquico de aninhamento destes comandos. Identação é uma prática em programação estruturada e é viável em compiladores que ignoram espaços ou linhas em branco.
Em geral, é boa prática de programação identar blocos de comandos de maneira que, visualmente, o programa fique mais claro e mostre quais linhas de código são executadas por um determinado comando em um certo trecho do programa.
O objetivo é permitir que programas fiquem melhor apresentados e mais fáceis de se entender. É importante mentalizar que para o computador não faz diferença nenhuma, mas para o ser humano que lê o código é absolutamente fundamental.
Sempre que um bloco de comandos estiver no escopo de um comando (significa estar sob o controle do comando), a identação passa a ser interessante. A técnica elementar é deslocar este bloco mais a direita do que o comando principal. Isto facilita muito a visualização de diferentes escopos no programa.
Os dois exemplos abaixo ilustram esta situação, o primeiro está bem identado, o segundo não.
Exemplo:
program exemplo_identacao_boa; var i: integer; begin for i:= 1 to 10 do write (i); writeln ('Fim.'); end.
Observe como o comando for foi deslocado 3 espaços para a direita com relação ao alinhamento begin-end do programa, bem como o comando write foi deslocado outros 3 espaços com relação a coluna do comando for (e portanto 6 com relação a ao begin-end). Já o comando que imprime a mensagem de fim ficou alinhado na mesma coluna do comando for, mostrando que está fora do seu escopo, isto é, consiste em um comando independente do for.
Exemplo:
program exemplo_identacao_ruim; var i: integer; begin for i:= 1 to 10 do write (i); writeln ('Fim.'); end.
O motivo da identação confusa do segundo exemplo é que, visualmente, quem lê o código tem a falsa impressão de que o comando que imprime o texto ``Fim.'' está no escopo do comando \texttt{for} e portanto será repetido 10 vezes, o que não é verdade!
Se esta fosse de fato a intenção do programador, então ele deveria ter escrito da maneira como é mostrado no exemplo abaixo:
Exemplo:
program corrigindo_identacao_ruim; var i: integer; begin for i:= 1 to 10 do begin write (i); writeln ('fim'); end; end.
Isto é, introduzindo o begin e o end que o programador provavelmente tinha esquecido.
O próximo exemplo é na verdade um contra-exemplo. Nunca se deve programar desta maneira, embora, como já dito, para o computador não faça diferença.
program exemplo_identacao_inaceitavel; var i: integer; begin for i:= 1 to 10 do write (i); writeln ('Fim.'); end.
O número de espaços do deslocamento depende da preferência do programador. Costuma-se utilizar entre 3 e 5 espaços em branco. Há programadores que utilizam a tabulação (tab), porém esta pode ser desconfigurada conforme o editor. Por outro lado, é possível configurar o tamanho da tabulação em diversos editores de texto, tais como vi ou emacs, por exemplo.
O importante é manter o mesmo número de espaços em todo o código. Deve-se também ter cuidado para não se avançar mais do que a última coluna da direita, pois o resultado também é confuso, conforme exemplo seguinte.
Exemplo:
program outro_exemplo_identacao_ruim; var i : integer; begin for i:= 1 to 10 do for j:= 1 to 10 do for k:= 1 to 10 do for l:= 1 to 10 do write (i, j, k, l); end.
Quando se aninham muitos if-then-else também pode-se obter o mesmo efeito. O próximo código mostra isso.
program mais_um_exemplo_identacao_ruim; var i : integer; begin read (i); if i < 1 then write (i,' menor que 1') else if i <= 10 then write (i,'entre 1 e 10') else if i <= 20 then write (i,' entre 11 e 20') else if i <= 30 then write (i,' entre 21 e 30') else if i <= 40 then write (i,' entre 31 e 40') else if i <= 50 then write (i,' entre 41 e 50') end.
Neste caso pode-se fazer como no exemplo abaixo.
program mais_um_exemplo_identacao_ruim; var i : integer; begin read (i); if i < 1 then write (i,' menor que 1') else if i <= 10 then write (i,'entre 1 e 10') else if i <= 20 then write (i,' entre 11 e 20') else if i <= 30 then write (i,' entre 21 e 30') else if i <= 40 then write (i,' entre 31 e 40') else if i <= 50 then write (i,' entre 41 e 50') end.
O melhor mesmo seria usar o comando case-of neste caso.