Czasami algorytm można zapisać na dwa sposoby:
- Krótki, fantazyjny sposób; lub
- Dłuższy, łatwy do zrozumienia sposób.
Na przykład, tutaj jest dłuższy, łatwiejszy sposób kopiowania łańcucha source
do dest
C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
A oto krótki, fantazyjny sposób.
// Copy string source to dest
while (*dest++ = *source++);
Zawsze słyszałem i czytałem, że należy unikać wymyślnego kodu i zazwyczaj się zgadzam. Ale co, jeśli weźmiemy pod uwagę komentarze? Załóżmy, że podobnie jak w powyższych przykładach mamy niepomentowany, dłuższy i rzekomo łatwiejszy do zrozumienia kod oraz dobrze skomentowany, krótki, fantazyjny kod? Czy nadal nie jest pożądany kod?
EDYCJA: Wielu skomentowało nazwy zmiennych, więc zmodyfikowałem przykładowy kod, aby nie uczynić tego czynnikiem, gdy wolę nad innymi. Próbowałem usunąć podwójne przypisanie w pierwszym przykładzie, ale to tylko uczyniło kod mniej czytelnym.
Być może nie był to najlepszy z przykładów, ponieważ wielu uważa, że „fantazyjny” kod jest bardziej czytelny i zrozumiały niż dłuższy kod. Chodziło o to, aby mieć jeden dłuższy kod, który był znacznie łatwiejszy do zrozumienia niż bardzo krótki, ale skomplikowany kod.
EDIT2: Oto nowy przykład, który dostałem od SO :
Skomentowana fantazyjna wersja:
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Długa wersja bez komentarza:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}