সংকলক স্বয়ংক্রিয়ভাবে সুইচটিতে প্রতিটি কোড ব্লকের পরে ব্রেক স্টেটমেন্ট দেয় না কেন? এটি কি historicalতিহাসিক কারণে? আপনি কখন একাধিক কোড ব্লকগুলি কার্যকর করতে চান?
উত্তর:
কখনও কখনও একই কোড ব্লকের সাথে একাধিক কেস যুক্ত করা সহায়ক
case 'A':
case 'B':
case 'C':
doSomething();
break;
case 'D':
case 'E':
doSomethingElse();
break;
ইত্যাদি ঠিক একটি উদাহরণ।
আমার অভিজ্ঞতা হিসাবে, সাধারণত "কেটে যাওয়ার" পক্ষে খারাপ স্টাইল এবং একটি মামলার জন্য একাধিক ব্লকের কোড কার্যকর করা হয় তবে কিছু পরিস্থিতিতে এর ব্যবহারও হতে পারে।
// Intentional fallthrough.
আপনি যখন বিরতি বাদ দেন কেবল সর্বদা লাইনগুলিতে একটি মন্তব্য যুক্ত করুন । এটি আমার মতে "দুর্ঘটনাক্রমে বিরতি ভুলে যাওয়া সহজ" এর মতো খারাপ শৈলী নয়। পিএস অবশ্যই উত্তর হিসাবে যেমন সহজ ক্ষেত্রে না।
case
গুলি যদি এভাবে একসাথে রাখা হয় তবে আমি মন্তব্যটি নিয়ে বিরক্ত করব না । যদি তাদের মধ্যে কোড থাকে তবে হ্যাঁ, মন্তব্যটি সম্ভবত যোগ্যতাযুক্ত।
case
, যেমন: case 'A','B','C': doSomething(); case 'D','E': doSomethingElse();
ক্ষেত্রে ক্ষেত্রে বিরতি ছাড়াই। পাস্কাল এটি করতে পেরেছিলেন: "কেস স্টেটমেন্ট প্রতিটি নির্বাচকের সাথে অর্ডিনাল এক্সপ্রেশনের মানকে তুলনা করে, যা একটি ধ্রুবক, সাবরেঞ্জ বা কমা দ্বারা আলাদা হওয়া তাদের তালিকা হতে পারে" " ( wiki.freepascal.org/Case )
ঐতিহাসিকভাবে , এটা কারণ case
মূলত একটি সংজ্ঞা ছিল label
, নামেও পরিচিত লক্ষ্য বিন্দু A -এরgoto
কল । স্যুইচ স্টেটমেন্ট এবং এর সাথে যুক্ত কেসগুলি কোডের প্রবাহে একাধিক সম্ভাব্য এন্ট্রি পয়েন্ট সহ কেবল একটি মাল্টওয়ে শাখা উপস্থাপন করে।
যা যা বলেছিল, এটি প্রায় অসীম সংখ্যায় লক্ষ্য করা গেছে break
যা প্রায় সর্বদা পূর্বনির্ধারিত আচরণ যা আপনি বরং প্রতিটি ক্ষেত্রে শেষে করতে চান।
জাভা সি থেকে আসে এবং এটি সি থেকে সিনট্যাক্স from
এমন এক সময় রয়েছে যেখানে আপনি একাধিক কেস স্টেটমেন্ট চান যাতে কেবল একটি মৃত্যুদন্ড কার্যকর হয়। নীচে একটি নমুনা দেওয়া হবে যা আপনাকে জানাবে যে মাসে কত দিন রয়েছে।
class SwitchDemo2 {
public static void main(String[] args) {
int month = 2;
int year = 2000;
int numDays = 0;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((year % 4 == 0) && !(year % 100 == 0))
|| (year % 400 == 0) )
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
System.out.println("Number of Days = " + numDays);
}
}
আমি মনে করি এটি একটি ভুল। একটি ভাষা নির্মাণ break
হিসাবে এটি ডিফল্ট হিসাবে ঠিক তত সহজ এবং পরিবর্তে একটি fallthrough
কীওয়ার্ড রয়েছে। আমি যে কোডটি লিখেছি এবং পড়েছি সেগুলির বেশিরভাগ ক্ষেত্রেই প্রতিটি ক্ষেত্রে বিরতি রয়েছে।
continue <case name>
যা কোন মামলার বিবৃতি অব্যাহত রাখতে স্পষ্ট করে নির্দিষ্ট করতে দেয়;
case
বর্তমানের মধ্যে একটি স্বেচ্ছাসেবীর অনুমতি দেওয়ার সময় switch
এটি কেবল একটি হয়ে যায় goto
। ;-)
আপনি কেস ফল-থ্রু দিয়ে আকর্ষণীয় সব ধরণের কাজ করতে পারেন।
উদাহরণস্বরূপ, যাক আপনি সমস্ত ক্ষেত্রে একটি নির্দিষ্ট ক্রিয়া করতে চান তা বলতে দিন, তবে একটি নির্দিষ্ট ক্ষেত্রে আপনি সেই ক্রিয়াটি আরও কিছু করতে চান। পতনের মাধ্যমে একটি স্যুইচ স্টেটমেন্ট ব্যবহার করা এটি বেশ সহজ করে তুলবে।
switch (someValue)
{
case extendedActionValue:
// do extended action here, falls through to normal action
case normalActionValue:
case otherNormalActionValue:
// do normal action here
break;
}
অবশ্যই break
কোনও মামলা শেষে বিবৃতিটি ভুলে যাওয়া এবং অপ্রত্যাশিত আচরণের কারণ সহজ। আপনি ব্রেক স্টেটমেন্ট বাদ দিলে ভাল সংকলক আপনাকে সতর্ক করবে।
সংকলক স্বয়ংক্রিয়ভাবে সুইচটিতে প্রতিটি কোড ব্লকের পরে ব্রেক স্টেটমেন্ট দেয় না কেন?
বেশ কয়েকটি মামলার জন্য অভিন্ন ব্লক (যা বিশেষ-বিশেষায়িত হতে পারে) ব্যবহার করতে সক্ষম হওয়ার ভাল বাসনাটি বাদ দিয়ে ...
এটি কি historicalতিহাসিক কারণে? আপনি কখন একাধিক কোড ব্লকগুলি কার্যকর করতে চান?
এটি মূলত সি এর সাথে সামঞ্জস্যের জন্য এবং মূলত goto
কীওয়ার্ডরা পৃথিবীতে ঘোরাফেরা করার পরে যুক্তিযুক্তভাবে একটি প্রাচীন হ্যাক hack এটি কিছু আশ্চর্যজনক জিনিসকে অবশ্যই সক্ষম করে যেমন ডাফের ডিভাইস , তবে এটি তার পক্ষে বা বিপক্ষে কোনও বিষয় হ'ল ... সর্বোপরি তর্কাত্মক।
break
পরে সুইচ case
গুলি সুইচ স্টেটমেন্টে fallthrough এড়াতে ব্যবহার করা হয়। যদিও আকর্ষণীয়ভাবে এটি এখন নতুন তৈরি হওয়া স্যুইচ লেবেলের মাধ্যমে জেপি -325 এর মাধ্যমে প্রয়োগ করা সম্ভব ।
এই পরিবর্তনগুলির break
সাথে, প্রতিটি প্রদর্শিত সুইচটি case
আরও প্রদর্শিত হিসাবে এড়ানো যেতে পারে: -
public class SwitchExpressionsNoFallThrough {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int value = scanner.nextInt();
/*
* Before JEP-325
*/
switch (value) {
case 1:
System.out.println("one");
case 2:
System.out.println("two");
default:
System.out.println("many");
}
/*
* After JEP-325
*/
switch (value) {
case 1 ->System.out.println("one");
case 2 ->System.out.println("two");
default ->System.out.println("many");
}
}
}
উপর JDK-12 দিয়ে উপরের কোড নির্বাহ , তুলনামূলক আউটপুট হিসেবে দেখা যেতে পারে
//input
1
// output from the implementation before JEP-325
one
two
many
// output from the implementation after JEP-325
one
এবং
//input
2
// output from the implementation before JEP-325
two
many
// output from the implementation after JEP-325
two
এবং অবশ্যই জিনিস অপরিবর্তিত
// input
3
many // default case match
many // branches to 'default' as well
সুতরাং একই কাজটি করার জন্য আপনার যদি বেশ কয়েকটি ক্ষেত্রে প্রয়োজন হয় তবে আপনাকে কোডটি পুনরাবৃত্তি করতে হবে না:
case THIS:
case THAT:
{
code;
break;
}
বা আপনি যেমন কাজ করতে পারেন:
case THIS:
{
do this;
}
case THAT:
{
do that;
}
একটি ক্যাসকেড ফ্যাশনে।
সত্যিই বাগ / কনফিউশন প্রবণ, আপনি যদি আমাকে জিজ্ঞাসা করেন।
do this
এবং do that
কেবল এটির do that
জন্য?
Recordতিহাসিক রেকর্ড যতদূর যায়, টনি হোয়ার 1960 এর দশকে "কাঠামোগত প্রোগ্রামিং" বিপ্লবের সময় কেস স্টেটমেন্টটি আবিষ্কার করেছিলেন। টনির কেস স্টেটমেন্ট প্রতি কেস একাধিক লেবেল সমর্থন করে এবং কোনও দুর্গন্ধযুক্ত break
বিবৃতি ছাড়াই স্বয়ংক্রিয় প্রস্থানকে সমর্থন করে । সুস্পষ্টর প্রয়োজনের break
বিষয়টি বিসিপিএল / বি / সি লাইন থেকে বেরিয়ে আসে। ডেনিস রিচি লিখেছেন (ACM HOPL-II এ):
উদাহরণস্বরূপ, বিসিপিএল সুইচনের বিবৃতি থেকে বেরিয়ে আসা এনডেস্ক ভাষাটিতে উপস্থিত ছিল না যখন আমরা এটি 1960 এর দশকে শিখেছিলাম, এবং সুতরাং বি এবং সি স্যুইচ স্টেটমেন্ট থেকে পালাতে ব্রেক কীওয়ার্ডের ওভারলোডিং সচেতন না হয়ে বিবর্তন বিবর্তনের উপর নির্ভর করে পরিবর্তন.
আমি বিসিপিএল সম্পর্কে কোনও historicalতিহাসিক লেখা খুঁজে পাইনি, তবে রিচির মন্তব্য থেকে জানা যায় যে এটি break
কমবেশি একটি historicalতিহাসিক দুর্ঘটনা ছিল। বিসিপিএল পরে সমস্যাটি সমাধান করে ফেলেছিল, তবে সম্ভবত রিচি এবং থম্পসন ইউনিক্স আবিষ্কার করতে খুব ব্যস্ত ছিলেন যাতে এই জাতীয় বিবরণটি নিয়ে বিরক্ত করা যায় না :-)
break
"একাধিক কোড ব্লকগুলি কার্যকর করতে" অনুমতি দেয় এবং এই নকশা পছন্দটির প্রেরণার সাথে আরও বেশি উদ্বিগ্ন। অন্যরা সি থেকে জাভা পর্যন্ত সুপরিচিত heritageতিহ্যের কথা উল্লেখ করেছিলেন এবং এই উত্তর গবেষণাকে আরও সি-পূর্ব দিন পর্যন্ত ঠেলে দেয়। আমি আশা করি আমাদের প্রথম থেকেই এটি (যদিও খুব আদিম) প্যাটার্নটি মিলছিল।
জাভা সি থেকে উদ্ভূত, যার heritage তিহ্যটিতে ডফের ডিভাইস হিসাবে পরিচিত একটি প্রযুক্তি রয়েছে । এটি এমন একটি অপ্টিমাইজেশন যা কোনও break;
বিবৃতি অনুপস্থিতিতে নিয়ন্ত্রণের এক কেস থেকে অন্য ক্ষেত্রে পড়ে falls সি প্রমিতকরণের পরে, "বন্যের" মতো প্রচুর কোড ছিল এবং এই জাতীয় নির্মাণগুলিকে ভেঙে ফেলার জন্য ভাষাটি পরিবর্তন করা প্রতিকূল ছিল।
লোকেরা যেমন আগে বলেছিল, এটি হ'ল পতনের মাধ্যমে অনুমতি দেওয়া এবং এটি কোনও ভুল নয়, এটি একটি বৈশিষ্ট্য। যদি খুব বেশি break
বিবৃতি আপনাকে বিরক্ত করে return
তোলে তবে পরিবর্তে বিবৃতি ব্যবহার করে আপনি সেগুলি থেকে সহজেই মুক্তি পেতে পারেন । এটি আসলে একটি ভাল অনুশীলন, কারণ আপনার পদ্ধতিগুলি যতটা সম্ভব ছোট হওয়া উচিত (পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের জন্য) তাই switch
কোনও পদ্ধতির জন্য ইতিমধ্যে একটি বিবৃতি যথেষ্ট বড়, সুতরাং, একটি ভাল পদ্ধতিতে অন্য কোনও কিছু থাকা উচিত নয়, এটি একটি উদাহরণ:
public class SwitchTester{
private static final Log log = LogFactory.getLog(SwitchTester.class);
public static void main(String[] args){
log.info(monthsOfTheSeason(Season.WINTER));
log.info(monthsOfTheSeason(Season.SPRING));
log.info(monthsOfTheSeason(Season.SUMMER));
log.info(monthsOfTheSeason(Season.AUTUMN));
}
enum Season{WINTER, SPRING, SUMMER, AUTUMN};
static String monthsOfTheSeason(Season season){
switch(season){
case WINTER:
return "Dec, Jan, Feb";
case SPRING:
return "Mar, Apr, May";
case SUMMER:
return "Jun, Jul, Aug";
case AUTUMN:
return "Sep, Oct, Nov";
default:
//actually a NullPointerException will be thrown before reaching this
throw new IllegalArgumentException("Season must not be null");
}
}
}
মৃত্যুদন্ড কার্যকর:
12:37:25.760 [main] INFO lang.SwitchTester - Dec, Jan, Feb
12:37:25.762 [main] INFO lang.SwitchTester - Mar, Apr, May
12:37:25.762 [main] INFO lang.SwitchTester - Jun, Jul, Aug
12:37:25.762 [main] INFO lang.SwitchTester - Sep, Oct, Nov
প্রত্যাশিত.
সংকলক দ্বারা স্বয়ংক্রিয় বিরতি যুক্ত না করা 1 <= a <= 3
1 এবং 2 থেকে ব্রেক স্টেটমেন্ট সরিয়ে মত অবস্থার জন্য পরীক্ষা করতে একটি সুইচ / কেস ব্যবহার করা সম্ভব করে তোলে ।
switch(a) {
case 1: //I'm between 1 and 3
case 2: //I'm between 1 and 3
case 3: //I'm between 1 and 3
break;
}
এটি একটি পুরানো প্রশ্ন তবে বাস্তবে আমি আজ বিরতি বিবৃতি ছাড়াই মামলাটি ব্যবহার করেছি। বিরতি ব্যবহার না করা আসলে খুব কার্যকর যখন আপনার ক্রম অনুসারে বিভিন্ন ফাংশন একত্রিত করা দরকার।
উদাহরণস্বরূপ, টোকেন সহ ব্যবহারকারীকে প্রমাণীকরণের জন্য HTTP প্রতিক্রিয়া কোডগুলি ব্যবহার করা
সার্ভারের প্রতিক্রিয়া কোড 401 - টোকেনটি পুরানো -> টোকেনটি পুনরায় জন্মানো এবং ব্যবহারকারীকে লগ ইন করুন।
সার্ভারের প্রতিক্রিয়া কোড 200 - টোকেন ঠিক আছে -> লগ ব্যবহারকারীকে।
ক্ষেত্রে বিবৃতি:
case 404:
case 500:
{
Log.v("Server responses","Unable to respond due to server error");
break;
}
case 401:
{
//regenerate token
}
case 200:
{
// log in user
break;
}
এটি ব্যবহার করে আপনাকে 401 প্রতিক্রিয়াটির জন্য লগ ইন করতে হবে না কারণ যখন টোকেনটি পুনরায় জেনারেট করা হয় তখন রানটাইম 200 এর ক্ষেত্রে লাফ দেয়।
আপনি সহজেই অন্যান্য ধরণের সংখ্যা, মাস, গণনা আলাদা করতে পারবেন।
এই ক্ষেত্রে যদি এটি ভাল হয়;
public static void spanishNumbers(String span){
span = span.toLowerCase().replace(" ", "");
switch (span){
case "1":
case "jan": System.out.println("uno"); break;
case "2":
case "feb": System.out.println("dos"); break;
case "3":
case "mar": System.out.println("tres"); break;
case "4":
case "apr": System.out.println("cuatro"); break;
case "5":
case "may": System.out.println("cinco"); break;
case "6":
case "jun": System.out.println("seis"); break;
case "7":
case "jul": System.out.println("seite"); break;
case "8":
case "aug": System.out.println("ocho"); break;
case "9":
case "sep": System.out.println("nueve"); break;
case "10":
case "oct": System.out.println("diez"); break;
}
}
আমি এখন এমন প্রকল্পে কাজ করছি যেখানে break
আমার সুইচ বিবৃতিতে আমার প্রয়োজন হয় অন্যথায় কোডটি কাজ করবে না। আমার সাথে থাকুন এবং break
আপনার সুইচ স্টেটমেন্টে আপনার কী প্রয়োজন তা আমি একটি ভাল উদাহরণ দেব ।
কল্পনা করুন আপনার তিনটি রাজ্য রয়েছে, একটি যা ব্যবহারকারীর একটি সংখ্যা প্রবেশের জন্য অপেক্ষা করে, দ্বিতীয়টি এটি গণনা করে এবং তৃতীয়টি যোগফল মুদ্রণের জন্য।
সেক্ষেত্রে আপনার রয়েছে:
রাজ্যের এ খুঁজছি, আপনি দোহন ক্রম শুরু করতে চান state1 , তারপর state3 এবং পরিশেষে state2 । অন্যথায় আমরা যোগফলগুলি গণনা না করে কেবল ব্যবহারকারীদের ইনপুট প্রিন্ট করব। কেবল এটি আবার স্পষ্ট করার জন্য আমরা ব্যবহারকারীর একটি মান প্রবেশের জন্য অপেক্ষা করি, তারপরে যোগফল গণনা করে যোগফলটি মুদ্রণ করি।
এখানে একটি উদাহরণ কোড দেওয়া হয়েছে:
while(1){
switch(state){
case state1:
// Wait for user input code
state = state3; // Jump to state3
break;
case state2:
//Print the sum code
state = state3; // Jump to state3;
case state3:
// Calculate the sum code
state = wait; // Jump to state1
break;
}
}
যদি আমরা ব্যবহার না করি তবে break
এটি এই আদেশে, state1 , state2 এবং state3 কার্যকর করবে । তবে ব্যবহার করে break
আমরা এই দৃশ্যটিকে এড়াতে পারি এবং সঠিক পদ্ধতিতে অর্ডার করতে পারি যা শুরু করতে হবে স্টেট 1, তারপরে state3 এবং সর্বশেষ তবে সর্বনিম্ন নয় রাষ্ট্র 2 দিয়ে।
break
।