A veces, un algoritmo se puede escribir de dos maneras:
- El camino corto y elegante; o
- La forma más larga y fácil de entender.
Por ejemplo, aquí es un camino más largo, más fácil de copiar una cadena source
que dest
en C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
Y aquí hay una forma corta y elegante.
// Copy string source to dest
while (*dest++ = *source++);
Siempre he escuchado y leído que se debe evitar el código elegante, y tiendo a estar de acuerdo. Pero, ¿qué pasa si tomamos en cuenta los comentarios? Supongamos que, como en los ejemplos anteriores, tenemos un código no comentado, más largo y supuestamente más fácil de entender, y un código bien comentado, corto y elegante. ¿Todavía se prefiere el código no elegante?
EDITAR: Muchos han comentado los nombres de las variables, por lo que he modificado el código de ejemplo para que no sea un factor al preferir sobre el otro. Traté de eliminar la doble asignación en el primer ejemplo, pero eso solo hizo que el código fuera menos legible.
Quizás este no fue el mejor ejemplo porque muchos encuentran que el código 'elegante' es más legible y comprensible que el código más largo. La idea era tener un código más largo que fuera mucho más fácil de entender que un código muy corto pero complicado.
EDIT2: Aquí hay un nuevo examen que obtuve de SO :
Versión de lujo comentada:
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Versión larga no comentada:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}