আমি বর্তমানে রবার্ট সি মার্টিনের "ক্লিন কোড: এ হ্যান্ডবুক অফ এগ্রিল সফটওয়্যার ক্র্যাফটসম্যানশিপ" এর মাধ্যমে পড়ছি এবং কাজ করছি। কোনও ফাংশনটি কেবল কীভাবে একটি কাজ করা উচিত সে সম্পর্কে লেখক আলোচনা করেন এবং এভাবে তুলনামূলকভাবে সংক্ষিপ্ত হওয়া উচিত। বিশেষত মার্টিন লিখেছেন:
এটি সূচিত করে যে বিবৃতিগুলির মধ্যে যদি ব্লকগুলি থাকে, অন্য বিবৃতিগুলি থাকে, যখন বিবৃতিগুলি এবং এই জাতীয় একটি লাইন দীর্ঘ হওয়া উচিত। সম্ভবত সেই লাইনটি একটি ফাংশন কল হওয়া উচিত। এটি কেবল এনকোলেজিং ফাংশনটিকে ছোট রাখে না, তবে এটি ডকুমেন্টারি মানও যুক্ত করে কারণ ব্লকের মধ্যে ডাকা ফাংশনটির একটি সুন্দর বর্ণনামূলক নাম থাকতে পারে।
এটি এও বোঝায় যে নেস্টেড স্ট্রাকচারগুলি ধরে রাখতে ফাংশনগুলি যথেষ্ট পরিমাণে বড় হওয়া উচিত নয়। সুতরাং, কোনও ফাংশনের ইনডেন্ট স্তরটি এক বা দুটির বেশি হওয়া উচিত নয়। এটি অবশ্যই ফাংশনগুলি পড়তে ও বুঝতে সহজ করে তোলে
এটি বোধগম্য হয় তবে আমি পরিষ্কার কোড হিসাবে যা দেখি তার উদাহরণগুলির সাথে বিরোধিত হয় বলে মনে হয়। উদাহরণস্বরূপ নিম্নলিখিত পদ্ধতিটি গ্রহণ করুন:
public static boolean millerRabinPrimeTest(final int n) {
final int nMinus1 = n - 1;
final int s = Integer.numberOfTrailingZeros(nMinus1);
final int r = nMinus1 >> s;
//r must be odd, it is not checked here
int t = 1;
if (n >= 2047) {
t = 2;
}
if (n >= 1373653) {
t = 3;
}
if (n >= 25326001) {
t = 4;
} // works up to 3.2 billion, int range stops at 2.7 so we are safe :-)
BigInteger br = BigInteger.valueOf(r);
BigInteger bn = BigInteger.valueOf(n);
for (int i = 0; i < t; i++) {
BigInteger a = BigInteger.valueOf(SmallPrimes.PRIMES[i]);
BigInteger bPow = a.modPow(br, bn);
int y = bPow.intValue();
if ((1 != y) && (y != nMinus1)) {
int j = 1;
while ((j <= s - 1) && (nMinus1 != y)) {
long square = ((long) y) * y;
y = (int) (square % n);
if (1 == y) {
return false;
} // definitely composite
j++;
}
if (nMinus1 != y) {
return false;
} // definitely composite
}
}
return true; // definitely prime
}
}
এই কোডটি অ্যাপাচি কমন্স উত্স কোড রেপো থেকে নেওয়া হয়েছে: https://github.com/apache/commons-math/blob/master/src/main/java/org/apache/commons/math4/primes/SmallPrimes.java
পদ্ধতিটি আমার কাছে খুব পঠনযোগ্য বলে মনে হচ্ছে। এটির মতো অ্যালগরিদম বাস্তবায়নের জন্য (মিলার-রবিন প্রব্যাবিলিস্টিক প্রিমালটি টেস্ট বাস্তবায়ন), বইটি যেমন সংজ্ঞায়িত করা হয়েছে, তেমন কোডটি কীভাবে রাখা এবং এখনও এটি 'পরিষ্কার' বিবেচনা করা উপযুক্ত? অথবা এমনকি অ্যালগরিদমকে মূলত একটি সিরিজ ফাংশনগুলিতে কল করে যাতে "শুধুমাত্র একটি কাজ করে"? একটি পদ্ধতি নিষ্কাশন একটি দ্রুত উদাহরণ প্রথম তিনটি যদি বিবৃতি একটি ফাংশন থেকে সরানো হতে পারে:
private static int getTValue(int n)
{
int t = 1;
if (n >= 2047) {
t = 2;
}
if (n >= 1373653) {
t = 3;
}
if (n >= 25326001) {
t = 4;
}
return t;
}
দ্রষ্টব্য: সম্ভাব্য সদৃশটি (এই প্রশ্নটি আমার পক্ষেও সহায়ক) এই প্রশ্নটি আলাদা, কারণ আমি নির্ধারণ করার চেষ্টা করছি যে আমি ক্লিন কোডের লেখকের উদ্দেশ্য বুঝতে পেরেছি এবং জিনিসগুলিকে আরও বেশি করে দেওয়ার জন্য আমি একটি নির্দিষ্ট উদাহরণ সরবরাহ করছি কংক্রিট।