ক্লিন কোডটি বাস্তব জীবনে দেখতে কেমন লাগে তা বুঝতে সমস্যা


10

আমি বর্তমানে রবার্ট সি মার্টিনের "ক্লিন কোড: এ হ্যান্ডবুক অফ এগ্রিল সফটওয়্যার ক্র্যাফটসম্যানশিপ" এর মাধ্যমে পড়ছি এবং কাজ করছি। কোনও ফাংশনটি কেবল কীভাবে একটি কাজ করা উচিত সে সম্পর্কে লেখক আলোচনা করেন এবং এভাবে তুলনামূলকভাবে সংক্ষিপ্ত হওয়া উচিত। বিশেষত মার্টিন লিখেছেন:

এটি সূচিত করে যে বিবৃতিগুলির মধ্যে যদি ব্লকগুলি থাকে, অন্য বিবৃতিগুলি থাকে, যখন বিবৃতিগুলি এবং এই জাতীয় একটি লাইন দীর্ঘ হওয়া উচিত। সম্ভবত সেই লাইনটি একটি ফাংশন কল হওয়া উচিত। এটি কেবল এনকোলেজিং ফাংশনটিকে ছোট রাখে না, তবে এটি ডকুমেন্টারি মানও যুক্ত করে কারণ ব্লকের মধ্যে ডাকা ফাংশনটির একটি সুন্দর বর্ণনামূলক নাম থাকতে পারে।

এটি এও বোঝায় যে নেস্টেড স্ট্রাকচারগুলি ধরে রাখতে ফাংশনগুলি যথেষ্ট পরিমাণে বড় হওয়া উচিত নয়। সুতরাং, কোনও ফাংশনের ইনডেন্ট স্তরটি এক বা দুটির বেশি হওয়া উচিত নয়। এটি অবশ্যই ফাংশনগুলি পড়তে ও বুঝতে সহজ করে তোলে

এটি বোধগম্য হয় তবে আমি পরিষ্কার কোড হিসাবে যা দেখি তার উদাহরণগুলির সাথে বিরোধিত হয় বলে মনে হয়। উদাহরণস্বরূপ নিম্নলিখিত পদ্ধতিটি গ্রহণ করুন:

    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;
    }

দ্রষ্টব্য: সম্ভাব্য সদৃশটি (এই প্রশ্নটি আমার পক্ষেও সহায়ক) এই প্রশ্নটি আলাদা, কারণ আমি নির্ধারণ করার চেষ্টা করছি যে আমি ক্লিন কোডের লেখকের উদ্দেশ্য বুঝতে পেরেছি এবং জিনিসগুলিকে আরও বেশি করে দেওয়ার জন্য আমি একটি নির্দিষ্ট উদাহরণ সরবরাহ করছি কংক্রিট।


3
যতদূর আমি দেখতে পাচ্ছি এই ফাংশনটি কেবল একটি কাজ করে ... এটির কোনও পার্শ্ব প্রতিক্রিয়া নেই যা আমি দেখতে পাচ্ছি। আপনি কী ভাবছেন এটি পরিষ্কার নাও হতে পারে? এই ফাংশনের কোন অংশটিকে আপনি আরও পরিষ্কার করে অন্য ফাংশনে রাখার যোগ্য বলে বিবেচনা করবেন?
নিউটোপিয়ান

14
আপনার প্রশ্নের শিরোনামটি "বাস্তব জীবন" পরিস্থিতি সম্পর্কে জিজ্ঞাসা করে, এবং তারপরে আপনার উদাহরণটি আমাকে বাস্তব-অ-জীবনের ফাংশনের নিখুঁত উদাহরণের মতো দেখায় (কমপক্ষে, অ্যাপ্লিকেশন বা ওয়েব বিকাশকারীদের 99.9%)। অবশ্যই সেই নির্দিষ্ট ক্ষেত্রে কর্মরত সংখ্যা তাত্ত্বিক, গণিতবিদ বা কম্পিউটার বিজ্ঞানীদের পক্ষে এটি বাস্তব জীবনের কাজ হতে পারে।
ডক ব্রাউন


2
হ্যাঁ, আমার কাছে এটিই বাস্তব জীবন, কারণ আমি বর্তমানে গণনামূলক বীজগণিত সংখ্যা তত্ত্বের ক্ষেত্রে বিকাশ করছি :)
ইস্ট

2
আপনার বর্ণনা অনুসারে আমি সম্ভবত গেটটি ফ্যাক্টর () রিফেক্টর করব।
user949300

উত্তর:


17

"ক্লিন কোড" নিজেই শেষ নয়, এটি শেষ হওয়ার উপায়। আরও ছোট ফাংশনগুলিতে রিফ্যাক্টর করার প্রধান উদ্দেশ্য এবং কোডটি অন্য উপায়ে পরিষ্কার করা কোডটি বিকাশযোগ্য এবং বজায় রাখা যায়।

পাঠ্য বই থেকে "মিলার-রবিন" প্রাইম টেস্টের মতো খুব নির্দিষ্ট গাণিতিক অ্যালগরিদম বাছাই করার সময়, বেশিরভাগ প্রোগ্রামাররা এটি বিকশিত করতে চায় না want তাদের স্ট্যান্ডার্ড লক্ষ্য এটি পাঠ্য পুস্তকের সিউডো কোড থেকে সঠিকভাবে তাদের পরিবেশের প্রোগ্রামিং ভাষায় স্থানান্তর করা। এই উদ্দেশ্যে, আমি যতটা সম্ভব পাঠ্য পুস্তকটি অনুসরণ করার জন্য সুপারিশ করব, যার অর্থ সাধারণত রিফ্যাক্টর না করা।

তবে সেই ক্ষেত্রে গণিতবিদ হিসাবে যে কেউ কাজ করছেন যারা সেই অ্যালগরিদম নিয়ে কাজ করার চেষ্টা করছেন এবং এটিকে পরিবর্তন বা উন্নত করতে পারেন, আইএমএইচও এই ফাংশনটিকে আরও ছোট, নামযুক্ত হিসাবে বিভক্ত করে বা নামী স্থিরদের দ্বারা "ম্যাজিক সংখ্যার" গুচ্ছটি প্রতিস্থাপন করতে পারে, অন্য যে কোনও ধরণের কোডের মতো কোডকেও সহজ পরিবর্তন করতে সহায়তা করে।


1
আমি ঠিক এটিই খুঁজছিলাম। আমি যে ক্ষেত্রটি বিকাশ করছি সেখানে পরিষ্কার কোড অনুশীলনগুলি কখন ব্যবহার করতে হবে তা নির্ধারণ করতে আমার সমস্যা হয়েছিল Your আপনার উত্তরটি আমি যে স্পষ্টতা খুঁজছিলাম তা সরবরাহ করে। ধন্যবাদ!
ইস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.