কখনও কখনও একটি অ্যালগরিদম দুটি উপায়ে লেখা যেতে পারে:
- সংক্ষিপ্ত, অভিনব উপায়; অথবা
- দীর্ঘ, সহজে বোঝার উপায়।
উদাহরণস্বরূপ, এখানে একটি লম্বা একটি স্ট্রিং অনুলিপি এর সহজ উপায় আছে source
থেকে dest
সি:
*dest = *source;
while (*source != '\0') {
source++;
dest++;
*dest = *source;
} (true);
এবং এখানে একটি সংক্ষিপ্ত, অভিনব উপায়।
// Copy string source to dest
while (*dest++ = *source++);
আমি সবসময় শুনেছি এবং পড়েছি যে অভিনব কোডটি এড়ানো উচিত, এবং আমি সম্মতি পোষণ করি। তবে যদি আমরা মন্তব্যগুলিকে আমলে নিই তবে কী হবে? ধরে নিন যে, উপরের উদাহরণগুলির মতো, আমাদের কাছে একটি অনিবন্ধিত, দীর্ঘতর এবং অনুমিতভাবে বোঝা সহজ কোড এবং একটি ভাল মন্তব্য করা, সংক্ষিপ্ত, অভিনব কোড রয়েছে? অ-অভিনব কোডটি কি এখনও পছন্দসই?
সম্পাদনা: ভেরিয়েবলের নাম নিয়ে অনেকে মন্তব্য করেছেন, তাই আমি উদাহরণ কোডটি সংশোধন করেছি যাতে অন্যটির চেয়ে বেশি পছন্দ করার সময় কোনও ফ্যাক্টরটি তৈরি না হয়। আমি প্রথম উদাহরণে ডাবল অ্যাসাইনমেন্টটি সরিয়ে দেওয়ার চেষ্টা করেছি, তবে এটি কেবল কোডকে কম পাঠযোগ্য করে তুলবে।
সম্ভবত এটি সর্বোত্তম উদাহরণ নয় কারণ অনেকেই 'অভিনব' কোডটি দীর্ঘতর কোডের চেয়ে বেশি পঠনযোগ্য এবং বোধগম্য বলে মনে করেন। ধারণাটি ছিল একটি দীর্ঘতর কোড থাকা যা খুব সংক্ষিপ্ত তবে জটিল কোডের চেয়ে বোঝা সহজ।
সম্পাদনা 2: এসও থেকে আমি এখানে একটি নতুন পরীক্ষা পেয়েছি :
মন্তব্য অভিনব সংস্করণ:
//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;
}