Іноді алгоритм можна записати двома способами:
- Короткий, вигадливий шлях; або
- Більш довгий, зрозумілий спосіб.
Наприклад, тут більше, простіше спосіб копіювання рядка source
в dest
в C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
І ось короткий, вигадливий шлях.
// Copy string source to dest
while (*dest++ = *source++);
Я завжди чув і читав, що фантазійного коду слід уникати, і я схильний погоджуватися. Але що робити, якщо ми врахуємо коментарі? Припустимо, що, як у наведених вище прикладах, у нас є коментований, довший і нібито простіший для розуміння код, і добре коментований, короткий, фантазійний код? Чи все-таки переважний нечутливий код?
EDIT: Багато хто прокоментував імена змінних, тому я змінив приклад коду, щоб не робити це чинником, коли надаю перевагу іншим. Я спробував видалити подвійне призначення у першому прикладі, але це лише зробило код менш читабельним.
Можливо, це був не найкращий приклад, тому що багато хто вважає "фантазійний" код читабельнішим і зрозумілішим, ніж довший код. Ідея полягала в тому, щоб мати один довший код, який було набагато простіше зрозуміти, ніж дуже короткий, але складний код.
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;
}