Иногда алгоритм может быть написан двумя способами:
- Короткий, причудливый путь; или
- Более длинный и понятный способ.
Например, здесь больше, проще способ копирования строки source
в dest
в C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
И вот короткий, причудливый путь.
// Copy string source to dest
while (*dest++ = *source++);
Я всегда слышал и читал, что нужно избегать причудливого кода, и я склонен согласиться. Но что, если мы примем во внимание комментарии? Предположим, что, как и в приведенных выше примерах, у нас есть некомментированный, более длинный и, предположительно, более легкий для понимания код и хорошо прокомментированный, короткий, причудливый код? Не причудливый код все еще предпочтителен?
РЕДАКТИРОВАТЬ: Многие прокомментировали имена переменных, поэтому я изменил пример кода, чтобы не делать этого фактора при предпочтении над другими. Я попытался удалить двойное назначение в первом примере, но это только сделало код менее читабельным.
Возможно, это был не лучший пример, потому что многие находят «причудливый» код более читабельным и понятным, чем более длинный код. Идея заключалась в том, чтобы иметь один более длинный код, который был бы намного легче понять, чем очень короткий, но сложный код.
EDIT2: вот новый пример, который я получил от SO :
Комментированная модная версия:
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Длинная версия без комментариев:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}