A volte un algoritmo può essere scritto in due modi:
- Il modo breve, elegante; o
- Il modo più lungo e facile da capire.
Ad esempio, ecco un modo più semplice e più lungo di copiare una stringa source
in dest
in C:
*dest = *source;
while (*source != '// Copy string source to dest
while (*dest++ = *source++);
') {
source++;
dest++;
*dest = *source;
} (true);
Ed ecco un modo breve, elegante.
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Ho sempre sentito e letto che il codice di fantasia dovrebbe essere evitato, e sono tendenzialmente d'accordo. Ma cosa succede se prendiamo in considerazione i commenti? Supponiamo che, come negli esempi precedenti, abbiamo un codice non commentato, più lungo e apparentemente più facile da capire, e un codice ben organizzato, breve e di fantasia? Il codice non elegante è ancora preferito?
EDIT: molti hanno commentato nomi di variabili, quindi ho modificato il codice di esempio in modo da non renderlo un fattore quando preferisco l'altro. Ho provato a rimuovere il doppio incarico nel primo esempio, ma questo ha reso il codice meno leggibile.
Forse questo non era il migliore degli esempi perché molti trovano il codice "fantasioso" più leggibile e comprensibile rispetto al codice più lungo. L'idea era di avere un codice più lungo che fosse molto più facile da capire di un codice molto breve ma complicato.
EDIT2: Ecco un nuovo esame che ho ricevuto da SO :
Versione di fantasia commentata:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}
Versione lunga non commentata:
*dest = *source;
while (*source != '// Copy string source to dest
while (*dest++ = *source++);
') {
source++;
dest++;
*dest = *source;
} (true);