Đôi khi một thuật toán có thể được viết theo hai cách:
- Cách ngắn gọn, lạ mắt; hoặc là
- Cách dài hơn, dễ hiểu.
Ví dụ, đây là một cách dễ dàng hơn còn sao chép một chuỗi source
để dest
trong C:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
Và đây là một cách ngắn gọn, lạ mắt.
// Copy string source to dest
while (*dest++ = *source++);
Tôi đã luôn luôn nghe và đọc rằng mã ưa thích nên tránh và tôi có xu hướng đồng ý. Nhưng nếu chúng ta đưa ý kiến vào tài khoản thì sao? Giả sử rằng, như trong các ví dụ trên, chúng ta có một mã không bị lỗi, dài hơn và được cho là dễ hiểu hơn, và một mã được nhận xét tốt, ngắn, lạ mắt? Là mã không ưa thích vẫn còn được ưa thích?
EDIT: Nhiều người đã nhận xét về các tên biến, vì vậy tôi đã sửa đổi mã ví dụ để không biến nó thành một yếu tố khi thích hơn các tên khác. Tôi đã cố gắng loại bỏ phép gán kép trong ví dụ đầu tiên, nhưng điều đó chỉ làm cho mã ít đọc hơn.
Có lẽ đây không phải là ví dụ tốt nhất vì nhiều người tìm thấy mã 'ưa thích' dễ đọc và dễ hiểu hơn mã dài hơn. Ý tưởng là có một mã dài hơn, dễ hiểu hơn nhiều so với mã rất ngắn nhưng phức tạp.
EDIT2: Đây là một bài kiểm tra mới tôi nhận được từ SO :
Nhận xét phiên bản ưa thích:
//direct formula for xoring all numbers from 1 to N
int Sum = (N & (N % 2 ? 0 : ~0) | ( ((N & 2)>>1) ^ (N & 1) ) );
Phiên bản dài không bình luận:
int Sum = 0;
for (int i = 1; i < N; ++i)
{
Sum ^= i; //or Sum = Sum ^ i;
}