Às vezes, um algoritmo pode ser escrito de duas maneiras:
- O caminho curto e chique; ou
- A maneira mais longa e fácil de entender.
Por exemplo, aqui está uma maneira mais longa e fácil de copiar uma string source
para dest
C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
E aqui está uma maneira curta e chique.
// Copy string source to dest
while (*dest++ = *source++);
Eu sempre ouvi e li que códigos sofisticados devem ser evitados, e costumo concordar. Mas e se levarmos em conta os comentários? Suponha que, como nos exemplos acima, tenhamos um código não comentado, mais longo e supostamente mais fácil de entender, e um código bem comentado, curto e sofisticado? O código não sofisticado ainda é o preferido?
Edição: Muitos comentaram sobre nomes de variáveis, então eu modifiquei o código de exemplo para não tornar isso um fator ao preferir sobre o outro. Tentei remover a atribuição dupla no primeiro exemplo, mas isso apenas tornou o código menos legível.
Talvez este não tenha sido o melhor dos exemplos, porque muitos acham o código "sofisticado" mais legível e compreensível que o código mais longo. A idéia era ter um código mais longo que fosse muito mais fácil de entender do que um código muito curto, mas complicado.
EDIT2: Aqui está um novo exame que recebi da SO :
Versão chique comentada:
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Versão longa não comentada:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}