জাভা সুইচ সম্পর্কে কিছুটা তত্ত্ব

কল্পনা করুন যে আপনি একজন নাইট যিনি রাস্তার একটি কাঁটাচামচ থামিয়েছেন। আপনি যদি বামে যান, আপনি আপনার ঘোড়া হারাবেন. সঠিক পথে চললে জ্ঞান লাভ হবে। কিভাবে আমরা কোড এই পরিস্থিতি প্রতিনিধিত্ব করবে? আপনি সম্ভবত ইতিমধ্যেই জানেন যে এই সিদ্ধান্তগুলি নেওয়ার জন্য আমরা if-then এবং if-then-else এর মতো গঠন ব্যবহার করি।

if (turn_left) { 
    System.out.println("You will lose your horse"); 
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else 
    System.out.println("So you're just going to stand there?");

কিন্তু রাস্তা যদি দুই ভাগ না হয়ে দশ ভাগ হয়ে যায়? আপনার কাছে "সম্পূর্ণভাবে ডানদিকে", "এর সামান্য বাম দিকে", "বামে একটু বেশি" ইত্যাদি রাস্তা আছে, মোট 10টি সম্ভাব্য রাস্তা? এই সংস্করণে আপনার "যদি-তাহলে-অন্যথা " কোডটি কীভাবে বৃদ্ধি পাবে তা কল্পনা করুন!

if (option1)
{…}
else if (option2)
{…}
…
else if (optionN) ...
ধরুন আপনার রাস্তায় 10-পথের কাঁটা আছে (এটি গুরুত্বপূর্ণ যে বিকল্পের সংখ্যা সীমিত)। এই ধরনের পরিস্থিতিতে, জাভা সুইচ বিবৃতি আছে.

       switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }

এই বিবৃতি কিভাবে কাজ করে:
  • ExpressionForMakingAChoice মূল্যায়ন করা হয়। তারপর সুইচ বিবৃতি পরবর্তী ValueX এর সাথে ফলাফলের মান তুলনা করে (যে ক্রমে সেগুলি তালিকাভুক্ত করা হয়েছে)।
  • ExpressionForMakingAChoice যদি ValueX এর সাথে মেলে, তাহলে কোলন অনুসরণকারী কোডটি কার্যকর করা হয়।
  • যদি একটি বিরতি বিবৃতি সম্মুখীন হয়, তারপর নিয়ন্ত্রণ সুইচ বিবৃতি বাইরে স্থানান্তর করা হয়.
  • যদি ExpressionForMakingAChoice কোনো ValueX-এর সাথে মেলে না, তাহলে CodeForDefaultCase-এ নিয়ন্ত্রণ পাস।
গুরুত্বপূর্ণ পয়েন্ট
  • সুইচ স্টেটমেন্টে, ExpressionForMakingAChoice এর ধরন অবশ্যই নিম্নলিখিতগুলির মধ্যে একটি হতে হবে:

    • বাইট , সংক্ষিপ্ত , গৃহস্থালি , int .
    • বাইট , সংক্ষিপ্ত , অক্ষর , পূর্ণসংখ্যা (আদিম ডেটাটাইপগুলির মোড়ক)।
    • স্ট্রিং _
    • এনাম _
  • ডিফল্ট ব্লক ঐচ্ছিক যদি এটি অনুপস্থিত থাকে এবং ExpressionForMakingAChoice কোনো ValueX-এর সাথে মেলে না, তাহলে কোনো কাজ করা হবে না।
  • বিরতি বিবৃতি প্রয়োজন হয় না . এটি অনুপস্থিত থাকলে, প্রথম বিরতি না হওয়া পর্যন্ত বা সুইচ স্টেটমেন্ট শেষ না হওয়া পর্যন্ত কোডটি কার্যকর করা অব্যাহত থাকবে (কেস বিবৃতিতে আরও তুলনা উপেক্ষা করে)।
  • যদি একই কোডটি বেশ কয়েকটি পছন্দের জন্য কার্যকর করার প্রয়োজন হয়, আমরা বেশ কয়েকটি ধারাবাহিক কেস বিবৃতি নির্দিষ্ট করে সদৃশতা দূর করতে পারি।

এখন জাভাতে কীভাবে সুইচ স্টেটমেন্ট ব্যবহার করা হয় তা দেখে নেওয়া যাক

আপনি চিন্তা করবেন না: আমরা তত্ত্ব দিয়ে সম্পন্ন করেছি। আপনি নিম্নলিখিত উদাহরণগুলি দেখার পরে, সবকিছু আরও পরিষ্কার হয়ে যাবে। আচ্ছা, শুরু করা যাক. আমাদের সৌরজগতের গ্রহগুলি জড়িত জ্যোতির্বিদ্যা থেকে একটি উদাহরণ দেখা যাক। সর্বশেষ আন্তর্জাতিক মনোভাব অনুসারে, আমরা প্লুটোকে (এর কক্ষপথের বৈশিষ্ট্যের কারণে) বাদ দিয়েছি। আমরা স্মরণ করি যে আমাদের গ্রহগুলি সূর্য থেকে তাদের দূরত্ব অনুসারে সাজানো হয়েছে: বুধ, শুক্র, পৃথিবী, মঙ্গল, বৃহস্পতি, শনি, ইউরেনাস এবং নেপচুন। আসুন একটি জাভা পদ্ধতি লিখি যা একটি গ্রহের ক্রমিক সংখ্যা (সূর্য থেকে এর দূরত্বের সাথে আপেক্ষিক) নেয় এবং গ্রহের বায়ুমণ্ডলের প্রধান উপাদানগুলিকে একটি তালিকা হিসাবে ফেরত দেয়।. আপনি মনে রাখবেন যে কিছু গ্রহের একটি অনুরূপ বায়ুমণ্ডলীয় রচনা আছে। এইভাবে, শুক্র এবং মঙ্গল প্রধানত কার্বন ডাই অক্সাইড ধারণ করে; বৃহস্পতি এবং শনির বায়ুমণ্ডল হাইড্রোজেন এবং হিলিয়াম নিয়ে গঠিত; এবং ইউরেনাস এবং নেপচুন গ্যাসের শেষ জোড়াতে মিথেন যোগ করে। এখানে আমাদের ফাংশন:

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
মনে রাখবেন যে আমরা অভিন্ন বায়ুমণ্ডলীয় রচনা সহ গ্রহগুলির জন্য একই কোড ব্যবহার করছি। আমরা ধারাবাহিক কেস স্টেটমেন্ট ব্যবহার করে এটি করেছি । আমরা যদি আমাদের বাড়ির গ্রহের বায়ুমণ্ডলের সংমিশ্রণ পেতে চাই, তাহলে আমরা 3 দিয়ে আমাদের পদ্ধতিকে যুক্তি হিসাবে বলি:

getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
বিরতির সাথে পরীক্ষা: আমরা যদি সমস্ত বিরতি বিবৃতি মুছে ফেলি তাহলে কী হবে? একটা চেষ্টা করা যাক:

    public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
        List<String> result = new ArrayList<>();
        switch (seqNumberFromSun) {
            case 1: result.add("No atmosphere");
            case 2:
            case 4: result.add("Carbon dioxide");
            case 3: result.add("Carbon dioxide");
                result.add("Nitrogen");
                result.add ("Oxygen");
            case 5:
            case 6: result.add("Hydrogen");
                result.add("Helium");
            case 7:
            case 8: result.add("Methane");
                result.add("Hydrogen");
                result.add("Helium");
            default:
        }
        return result;
    }
যদি আমরা System.out.println(getPlanetAtmosphere(3)) এর ফলাফল প্রিন্ট করি , তাহলে আমরা দেখতে পাব যে আমাদের গৃহ গ্রহটি এতটা বাসযোগ্য নয়। অথবা এটা? নিজের জন্য বিচার করুন: ["কার্বন ডাই অক্সাইড", "নাইট্রোজেন", "অক্সিজেন", "হাইড্রোজেন", "হিলিয়াম", "মিথেন", "হাইড্রোজেন", "হিলিয়াম"] । এটা কেন হল? প্রোগ্রামটি প্রথম ম্যাচের পরে সুইচ ব্লকের শেষ পর্যন্ত সমস্ত কেস স্টেটমেন্ট চালায়।

বিরতি বিবৃতি অত্যধিক অপ্টিমাইজেশান

মনে রাখবেন যে আমরা ব্রেক স্টেটমেন্ট এবং কেস আলাদাভাবে সাজিয়ে পদ্ধতিটি উন্নত করতে পারি ।

public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
কম কোড মত দেখাচ্ছে, তাই না? আমরা কেস স্টেটমেন্টের অর্ডারের সাথে খেলা করে এবং সেগুলিকে পুনরায় গোষ্ঠীবদ্ধ করে বিবৃতির মোট সংখ্যা হ্রাস করেছি। এখন প্রতিটি ধরনের গ্যাস শুধুমাত্র একটি লাইনের কোডে তালিকায় যোগ করা হয়েছে। শেষ উদাহরণে দেওয়া কোডটি শুধুমাত্র দেখানোর জন্য যে জিনিসগুলি কীভাবে কাজ করে। আমরা এইভাবে কোড লেখার সুপারিশ করি না। যদি এই ধরনের জাভা কোডের লেখককে (অন্যান্য প্রোগ্রামারদেরকে ছেড়ে দিন) অবশ্যই এটি বজায় রাখতে হবে, তবে এই কেস ব্লকগুলি এবং স্যুইচ স্টেটমেন্টে কার্যকর করা কোডগুলির গঠনের পিছনে যুক্তি পুনর্গঠন করা তার পক্ষে খুব কঠিন হবে।

যদি থেকে পার্থক্য

if এবং switch স্টেটমেন্টের বাহ্যিক মিলের প্রেক্ষিতে , ভুলে যাবেন না যে স্যুইচ স্টেটমেন্ট একটি নির্দিষ্ট মূল্যের উপর ভিত্তি করে কেসগুলির মধ্যে একটি নির্বাচন করে, যেখানে if স্টেটমেন্টের কোনো বুলিয়ান এক্সপ্রেশন থাকতে পারে। আপনার কোড ডিজাইন করার সময় এটি মনে রাখবেন।

উপসংহার

  • ইফ স্টেটমেন্টের সাথে আপনার কোড বিশৃঙ্খল না করার জন্য দুইটির বেশি শাখার জন্য কেস স্টেটমেন্ট ব্যবহার করুন ।
  • একটি বিরতি বিবৃতি সন্নিবেশ করে প্রতিটি নির্দিষ্ট মান (কেস স্টেটমেন্ট) এর জন্য শাখার লজিক্যাল ব্লক সম্পূর্ণ করতে ভুলবেন না ।
  • সুইচ স্টেটমেন্টের এক্সপ্রেশন একটি Enum বা String হতে পারে , সেইসাথে কিছু আদিম প্রকার
  • ডিফল্ট ব্লক মনে রাখবেন . অপ্রত্যাশিত মানগুলি পরিচালনা করতে এটি ব্যবহার করুন।
  • কর্মক্ষমতা অপ্টিমাইজ করতে, স্যুইচ ব্লকের শুরুতে সবচেয়ে সাধারণ মানগুলির সাথে সম্পর্কিত কোড শাখাগুলি সরান ৷
  • কেস স্টেটমেন্টের শেষে ব্রেক স্টেটমেন্ট ডিলিট করে আপনার "অপ্টিমাইজেশান"-এ বিচলিত হবেন না - এই ধরনের কোড বোঝা কঠিন, এবং ফলস্বরূপ, বজায় রাখা কঠিন।