জাভা সুইচ মামলা: বন্ধনী সহ বা ছাড়া?


86

ধনুর্বন্ধনী সহ নিম্নলিখিত দুটি স্নিপেট বিবেচনা করুন:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

ধনুর্বন্ধনী ছাড়া:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

আমি জানি যে, ধনুর্বন্ধনী সহ স্নিপেটে, প্রতিটি কেসকে বন্ধনীতে আবদ্ধ করে একটি নতুন সুযোগ তৈরি করা হয়। তবে, প্রতিটি ক্ষেত্রে যদি নতুন সুযোগের প্রয়োজন না হয় (অর্থাত্ কোনও পরিবর্তনশীল নাম পুনরায় ব্যবহার করা হচ্ছে না), তবে কোনও কেস সহ ধনুর্বন্ধনী ব্যবহারের জন্য কোনও ধরণের পারফরম্যান্স জরিমানা রয়েছে কি?

উত্তর:


100

কোনও কেস দিয়ে ধনুর্বন্ধনী ব্যবহারের জন্য কোনও ধরণের পারফরম্যান্স পেনাল্টি রয়েছে?

কিছুই না।

কোঁকড়া ধনুর্বন্ধনী এখানে কোনও সংকল্পযোগ্য, কোড কোড সংকলন করার পরে রানটাইম কর্মক্ষমতা প্রভাবিত করে না ইত্যাদি পরিবর্তনশীল, শর্ত, ফাংশন ডিক্লেয়ারেশন ইত্যাদির স্কোপটি বের করতে সহায়তা করে cur


21

কার্য সম্পাদনের দৃষ্টিকোন থেকে কোনও পারফরম্যান্স জরিমানা নেই।

সংশ্লেষের দিক থেকে সামান্য পারফরম্যান্স পেনাল্টি যেমন পার্স করার মতো আরও কিছু রয়েছে, তবে কেউ যদি সত্যিই উদ্বিগ্ন থাকেন তবে তাদের কোডগুলি একটি লাইনে লিখতে হবে :-)

এবং এখন আমাদের পোস্টের মতামত অংশের জন্য ... আমি সর্বদা {এবং in এ রেখেছি কারণ সেখানে রক্ষণাবেক্ষণের জন্য একটি শাস্তি রয়েছে যে আপনি সম্ভবত পরে কোনও তারিখে রেখে দিতে পারেন, এবং এগুলি রাখার ব্যথা হতে পারে পরে ... তবে এটি 103% ব্যক্তিগত পছন্দ।


আমি কিছুটা কৌতূহল করছি যেহেতু আমি নিজেই উত্তরটি দেখতে পাচ্ছি না ... @ তোফুবিয়ার, আপনি কখন বন্ধনী যুক্ত করবেন? এছাড়াও, আমি রক্ষণাবেক্ষণ পয়েন্টের সাথে পুরোপুরি একমত, আমি কেবল রক্ষণাবেক্ষণের সমস্যা এটিএম দেখতে পাচ্ছি না। সম্পাদনা: কিছুই নয়। আমি কেবল নীচের বাকী উত্তরগুলি পড়েছি।
ন্যারায়ে

আপনি কিছু ক্ষেত্রে সি ++ এ করেন, সুতরাং আপনি যদি উভয় ভাষায় কাজ করেন তবে তা কোনওর মধ্যে প্রবেশ করা খারাপ অভ্যাস নয়।
তোফুবিয়ার

13

আমরা জানি যে স্যুইচ কেসগুলির জন্য ধনুর্বন্ধনী প্রয়োজন হয় না। ধনুর্বন্ধনী কেসগুলি ব্যবহার করা মামলার ক্ষেত্র সম্পর্কে বিভ্রান্তির কারণ হতে পারে।

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

অর্থাত্ যখন আমার মতো কিছু হবে,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"হ্যালো ফোর 1" মুদ্রিত হয়। তবে কোঁকড়ানো ধনুর্বন্ধনী ব্যবহারটি একজন অজ্ঞ পাঠককে পরামর্শ দিতে পারে যে কেসটি '}' দিয়ে শেষ হয়, ইতিমধ্যে জেনে যে কোঁকড়ানো ধনুর্বন্ধনী সাধারণত লুপগুলি, পদ্ধতি ইত্যাদির ক্ষেত্রে কী বোঝায় generally

আমাদের যেমন 'সি' তে লাফানো-থেকে-লেবেল বিবৃতি রয়েছে যেমন নিয়ন্ত্রণটি কেবল কেস এ চলে আসে এবং এটি কার্যকর হয় continues সুতরাং, এই বোঝার সাথে স্যুইচের জন্য কেসগুলি লেখার সময় কোঁকড়া ধনুর্বন্ধনী ব্যবহার করা কেবল একটি BAD অনুশীলন।

প্রযুক্তিগতভাবে বলতে গেলে আপনি বৈধ সিনট্যাক্সের সাথে ব্যবহার করার সময় আপনার কোডের যে কোনও ব্লককে বাড়তি কোঁকড়া ধনুর্বন্ধনী দিয়ে ঘিরে রাখতে পারেন। স্যুইচ-তে ব্রেস ব্যবহার করা কমপক্ষে আমার কাছে খুব খারাপ দেখাচ্ছে কারণ আমি উপরে বলেছি বলে মনে হচ্ছে এটি অন্যরকম অনুভূতি দেয়।

আমার পরামর্শ: স্যুইচ কেসের জন্য কেবল আশেপাশের ধনুর্বন্ধনী ব্যবহার করা এড়িয়ে চলুন।


4
এটির সাথে দ্বিমত পোষণ করুন। ধনুর্বন্ধনী বাইরে ব্রেস এবং রাইটিং কোড ব্যবহার করা খুব খারাপ ফর্ম হতে হবে, হ্যাঁ, তবে এটি নিজের মধ্যে বন্ধনী ব্যবহারকে কলুষিত করে না।
ম্যাক্স রোনকেস

আপনার উদাহরণে উল্লিখিত পরিস্থিতিটি প্রতিরোধ করার জন্য সেখানে ধনুর্বন্ধনী রয়েছে ...
পেট্র ডভোক

12

ধনুর্বন্ধনী সঙ্গে।

এমন অনেকগুলি জিনিস রয়েছে যা স্যুইচ স্টেটমেন্টগুলির সাথে ভুল হতে পারে আমি সেগুলি এড়াতে চেষ্টা করি যেখানে আমি পারি, অর্থাত্

  1. বিরতি ভুলে যাওয়া এবং এভাবে কেস পড়ার ঘটনা ঘটে
  2. একটি ডিফল্ট কেস ভুলে যাওয়া এবং এইভাবে শর্তের জন্য একটি অন-কেটেড না ধরা
  3. ঘটনাক্রমে কেস স্টেটমেন্টগুলির মধ্যে ভেরিয়েবলগুলি পুনরায় ব্যবহার করা বা আরও খারাপ, একটি ভেরিয়েবলকে প্রভাবিত করে যা কেস স্টেটমেন্টের মধ্যে একটি ভেরিয়েবল ভাগ করে নিচ্ছে।

কেস স্টেটমেন্টের মধ্যে ভেরিয়েবলের ইচ্ছাকৃত এবং দুর্ঘটনাক্রমে ভাগ করে নেওয়া উভয় প্রতিরোধের এক ধরণের ধনুর্বন্ধনী ব্যবহার করা


9
1 এবং 2 পয়েন্ট সহ এই প্রশ্নের (আমার জন্য) বিভ্রান্তিকর ছিল; আপনার সমাপ্তি রেখায় স্পষ্টভাবে বলা উচিত যে ধনুর্বন্ধনী কেবল 3 টি সমাধান করে - আমি ভেবেছিলাম যে আপনি বোঝাতে চেয়েছিলেন যে বন্ধনীগুলি বিরতির প্রয়োজনকে বাদ দিয়েছে, তারপরে চেষ্টা করে দেখুন।
ataulm

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

আমি ঠিক (পুনরায়) আবিষ্কার করেছি যে 1 ক্ষেত্রে ঘোষিত ভেরিয়েবলগুলি এখনও 2 ক্ষেত্রে সুযোগের মধ্যে থাকতে পারে Eg উদাহরণস্বরূপ: ...case 1: int a = 10; break; case 2: int a = 11; break; ...সংকলন করে না। (ওরাকল
জেডিকে

5

এই প্রশ্নটি সম্ভবত "যুক্তিবাদী" (ব্র্যাক ওয়ার!) হিসাবে বন্ধ হতে চলেছে তবে হ্যাকটি কী। আমি আসলে মামলার পরে ধনুর্বন্ধনী পছন্দ করি। আমার কাছে এটি কুরুচিপূর্ণ স্যুইচ বাক্য গঠনটিকে বাকী ভাষা গঠনের মতো করে তোলে। (এই "কেস" এ ধনুর্বন্ধনী ব্যবহারের জন্য কোনও জরিমানা নেই)


আমি অনুমান করি এটি একটি উদ্দেশ্যমূলক প্রশ্ন ... আমি বিতর্কমূলক জিনিসটি প্রত্যাহার করি
অ্যান্ডি হোয়াইট

আমি এটি বন্ধনীগুলি ছাড়াই পছন্দ করি ... আমি দেখতে পাই বন্ধনীগুলি প্রচুর বিনা শোনায় add
সিডিএমকেয়ে

হ্যাঁ, আমি আশা করি এটি আরও এমনটি হয়েছিল: কেস (এফওও) {x = x + 1} কেস (বার) {y = y + 1}
অ্যান্ডি হোয়াইট

বোধগম্য সাদা স্থান == দুর্দান্ত। অপ্রয়োজনীয় ধনুর্বন্ধনী == স্তন্যপান।
শোগ

4
হোয়াইটস্পেস == ট্যাব এবং স্পেসের মিশ্রণ == স্তন্যপান (কেবল ভেবেছিলাম আমি একটি ট্যাব বনাম স্থান মিশ্রণে মন্তব্য করতে পারি)
অ্যান্ডি হোয়াইট

5

আপনি বলছেন বন্ধনীগুলি বাদ দেওয়া যেতে পারে কারণ কোনও ভেরিয়েবলের নাম পুনরায় ব্যবহার করা হচ্ছে না। ভেরিয়েবলের নামগুলি পুনরায় ব্যবহার করে, আমি ধরে নিলাম আপনি একই ধরণের নতুন ভেরিয়েবল ঘোষণার অর্থ।

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


3

আমি স্যুইচ কেসগুলির জন্য ধনুর্বন্ধনী ব্যবহার করব না।

  • স্যুইচ স্টেটমেন্টটি ব্রেস ছাড়া ইতিমধ্যে যথেষ্ট ব্যারাক দেখায়।

  • স্যুইচ কেসগুলি খুব ছোট হওয়া উচিত। যখন আপনাকে ভেরিয়েবলগুলি ঘোষণা করার দরকার হয় এটি এটি একটি চিহ্ন যে আপনি এটি ভুল করছেন।

এখন কিছু লিগ্যাসি সি কোড বজায় রাখা বন্ধ করা যায় যা স্পোর্টস 500+ লাইনের ক্ষেত্রে স্যুইচ করে ...


1

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

কোনও ধনুর্বন্ধনী ... কম সিনট্যাক্স বেশি


{এবং things জিনিসগুলি পাশাপাশি আলাদা করে তোলে, যা পড়তে সহজ করে তোলে (আইএমও)।
তোফুবিয়ার

হা. আমি একবারে এমন একটি পদ্ধতির একটি গল্প ভাগ করতে যাচ্ছিলাম যা একবার আমাকে সংশোধন করতে হয়েছিল (কোডের এক লাইন যুক্ত করতে আমাকে প্রায় 4 ঘন্টা সময় নিয়েছিল) তবে কোডটি উন্মাদ ছিল (মুদ্রিত হওয়ার সময় প্রায় 10 পৃষ্ঠা দীর্ঘ এবং 4 পৃষ্ঠার প্রশস্ত) তাই এটি নয় সাধারণ ক্ষেত্রে। তবে এটি যদি {use ব্যবহার করে থাকে তবে এটি যুক্ত করতে এক মিনিট সময় লাগত।
তোফুবিয়ার

আমি মনে করি বিন্দুটি এখানে যে মূল প্রোগ্রামার যদি}} ব্লকগুলি রাখার প্রয়াসে চলে যেত যাতে কোডটি আরও পাঠযোগ্য হয় তবে তারা সম্ভবত যত্নশীল হতে পারে যে তারা যেখানে 10 পৃষ্ঠার স্যুইচ স্টেটমেন্ট লিখছেন এবং কোডটিকে একটি হিসাবে পরিবর্তন করেছেন সামান্য কম উন্মাদ
গ্যারেথ ডেভিস

swtich একটি স্বপ্ন ছিল .. এটা / নেজেস ... যদি সিওএল প্রোগ্রামে COBOL প্রোগ্রামারদের দ্বারা লিখিত ছিল ... এটি পরে খুব বেশিদিন ছাড়েন না।
তোফুবিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.