এখানে উত্তর যুক্ত করতে, আমি মনে করি এটির সাথে মিল রেখে বিপরীত প্রশ্ন বিবেচনা করা উপযুক্ত worth সি প্রথমে পড়ার অনুমতি দিয়েছে কেন?
যে কোনও প্রোগ্রামিং ভাষা অবশ্যই দুটি লক্ষ্য পরিবেশন করে:
- কম্পিউটারে নির্দেশাবলী সরবরাহ করুন।
- প্রোগ্রামারের উদ্দেশ্যগুলির একটি রেকর্ড রেখে দিন।
যে কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ তৈরি করা কীভাবে এই দুটি লক্ষ্যকে সর্বোত্তমভাবে পরিবেশন করা যায় তার মধ্যে একটি ভারসাম্য। একদিকে কম্পিউটারের নির্দেশাবলীতে রূপান্তর করা সহজতর (সেগুলি মেশিন কোড, আইএলের মতো বাইকোড, বা নির্দেশাবলীর প্রয়োগের ক্ষেত্রে ব্যাখ্যা করা হয়) তবে সংকলন বা ব্যাখ্যার প্রক্রিয়াটি আরও দক্ষ, নির্ভরযোগ্য এবং কার্যকর হবে আউটপুট কমপ্যাক্ট। চূড়ান্ত দিকে নিয়ে যাওয়া, এই লক্ষ্যটি আমাদের সমাবেশ, আইএল, এমনকি কাঁচা অপ-কোডগুলিতে কেবল লেখার ফলাফল দেয় কারণ সহজতম সংকলনটি যেখানে কোনও সংকলন নেই।
বিপরীতে, ভাষা যতটা প্রোগ্রামারের অভিপ্রায় প্রকাশ করে, সেই লক্ষ্যে নেওয়া উপায়ের পরিবর্তে, লেখার সময় এবং রক্ষণাবেক্ষণের সময় প্রোগ্রামটি তত বেশি উপলব্ধিযোগ্য।
এখন, switch
সর্বদা এটি if-else
ব্লক বা এর সমতুল্য চেইনে রূপান্তর করে সংকলন করা যেতে পারে , তবে এটি একটি সাধারণ সাধারণ প্যাটার্নে সংকলনকে অনুমতি হিসাবে ডিজাইন করা হয়েছিল যেখানে কোনও মান নেয়, সেখান থেকে একটি অফসেট গণনা করে (কোনও টেবিলটি সন্ধান করেই হোক) মানের একটি নিখুঁত হ্যাশ দ্বারা সূচকযুক্ত, বা মান * এর প্রকৃত গাণিতিক দ্বারা। এই মুহুর্তে এটি লক্ষণীয় যে আজ সি # সংকলনটি কখনও কখনও switch
সমতুল্য হয়ে যায় if-else
এবং কখনও কখনও হ্যাশ-ভিত্তিক জাম্প পদ্ধতির (এবং একইভাবে সি, সি ++, এবং তুলনীয় বাক্য গঠন সহ অন্যান্য ভাষার সাথে) ব্যবহার করে।
এই ক্ষেত্রে পতনের মাধ্যমে অনুমতি দেওয়ার জন্য দুটি ভাল কারণ রয়েছে:
এটি কেবল প্রাকৃতিকভাবেই ঘটে: আপনি যদি নির্দেশাবলীর একটি সেটটিতে একটি জাম্প টেবিল তৈরি করেন এবং নির্দেশাবলীর আগের কোনও একটি ব্যাচে কোনও ধরণের লাফ বা প্রত্যাবর্তন না থাকে তবে মৃত্যুদন্ড কার্যকরভাবে পরবর্তী ব্যাচে অগ্রসর হবে। আপনি যদি switch
মেশিন কোডটি ব্যবহার করে -জপ-সি-কে জাম্প-টেবিল-এ পরিণত করেন তবে ফল্ট-থ্রো -এর মাধ্যমে অনুমতি দেওয়া হ'ল "সবেমাত্র ঘটবে" ।
সমাবেশে লিখেছেন এমন কোডাররা ইতিমধ্যে সমতুল্য হিসাবে ব্যবহার করেছিলেন: সমাবেশে হাতে লাফিয়ে টেবিল লেখার সময় তাদের বিবেচনা করতে হবে যে প্রদত্ত কোডের ব্লকটি কোনও রিটার্নের সাথে শেষ হবে, টেবিলের বাইরের একটি জাম্প হবে বা কেবল চালিয়ে যাবে পরের ব্লকে যেমন break
প্রয়োজনে কোডারকে একটি স্পষ্ট যোগ করার সাথে সাথে কোডারের জন্যও "প্রাকৃতিক" ছিল।
সেই সময়, এটি একটি কম্পিউটার ভাষার দুটি লক্ষ্যকে সামঞ্জস্য করার একটি যুক্তিসঙ্গত প্রয়াস ছিল কারণ এটি উত্পাদিত মেশিন কোড এবং উত্স কোডের অভিব্যক্তি উভয়ের সাথেই সম্পর্কিত।
চার দশক পরে যদিও, কয়েকটি কারণে কয়েকটি জিনিস এক রকম নয়:
- সি এর কোডারদের আজ অ্যাসেমব্লির অভিজ্ঞতা কম বা নাও থাকতে পারে। অন্যান্য অনেক সি-স্টাইলের ভাষায় কোডারগুলির সম্ভাবনা কম (বিশেষত জাভাস্ক্রিপ্ট!)। "সমাবেশ থেকে লোকেরা কী অভ্যস্ত" এর কোনও ধারণাই প্রাসঙ্গিক নয়।
- অপ্টিমাইজেশনের উন্নতির অর্থ হল যেহেতু
switch
রূপান্তরিত হওয়ার সম্ভাবনা সম্ভবত এপ্রোচকে if-else
সবচেয়ে দক্ষ বলে মনে করা হয়েছিল, বা অন্যথায় জাম্প-টেবিলের পদ্ধতির একটি বিশেষত রূপান্তরিত রূপান্তরিত হওয়া বেশি। উচ্চতর এবং নিম্ন-স্তরের পদ্ধতির মধ্যে ম্যাপিংটি আগের মতো শক্তিশালী নয়।
- অভিজ্ঞতা দেখিয়েছে যে পতনের মাধ্যমে আদর্শের চেয়ে সংখ্যালঘু ক্ষেত্রে পরিণত হয় (সান সংকলকের এক গবেষণায় দেখা গেছে যে 3%
switch
ব্লক একই ব্লকের একাধিক লেবেল ব্যতীত অন্য একটি পতন-মাধ্যমে ব্যবহার করেছিল, এবং মনে করা হয়েছিল যে এটি ব্যবহার- এখানে কেসটির অর্থ এই 3% আসলে স্বাভাবিকের চেয়ে অনেক বেশি ছিল)। সুতরাং অধ্যয়নকৃত ভাষাটি সাধারণের চেয়ে অস্বাভাবিকটিকে আরও স্বাচ্ছন্দ্যে পোহিত করে তোলে।
- অভিজ্ঞতাটি দেখিয়েছে যে দুর্ঘটনাক্রমে এমন ঘটনা ঘটেছে এবং যে কোনও ক্ষেত্রে কোডটি বজায় রেখে সঠিক ফল-থ্রুটি মিস করা হয়েছে এমন ক্ষেত্রেও পতনের মধ্য দিয়েই সমস্যার উত্স হয়ে থাকে। এই পরবর্তীটি পতনের মাধ্যমে সম্পর্কিত বাগগুলির জন্য একটি সূক্ষ্ম সংযোজন, কারণ আপনার কোডটি পুরোপুরি বাগ-মুক্ত থাকলেও আপনার পতনের মাধ্যমে এখনও সমস্যা দেখা দিতে পারে।
এই শেষ দুটি পয়েন্ট সম্পর্কিত, কে & আর এর বর্তমান সংস্করণ থেকে নিম্নলিখিত উদ্ধৃতি বিবেচনা করুন:
এক থেকে অন্য ক্ষেত্রে পড়ার বিষয়টি দৃust় নয়, যখন প্রোগ্রামটি সংশোধন করা হবে তখন বিচ্ছিন্ন হওয়ার ঝুঁকিপূর্ণ। একক গণনার জন্য একাধিক লেবেল ব্যতীত, পতনের মাধ্যমে অল্প ব্যবহার করা উচিত এবং মন্তব্য করা উচিত।
ভাল ফর্মের বিষয়টি হিসাবে, এটি লজিক্যাল অপ্রয়োজনীয় হওয়া সত্ত্বেও শেষ কেস (এখানে ডিফল্ট) পরে একটি ব্রেক দিন। কোনও দিন যখন অন্য কেস শেষে যুক্ত হয়, এই বিট ডিফেন্সিভ প্রোগ্রামিং আপনাকে বাঁচায়।
সুতরাং, ঘোড়ার মুখ থেকে, সি-এর মধ্যে পড়ে সমস্যাযুক্ত। মন্তব্য সহ সর্বদা নথিভুক্ত করা ভাল অনুশীলন হিসাবে বিবেচিত হয়, এটি এমন একটি সাধারণ নীতি যা অ্যাপ্লিকেশনটি যেখানে কোনওটি অস্বাভাবিক কিছু করে সেখানে ডকুমেন্ট করা উচিত, কারণ কোডটি পরবর্তী পরীক্ষায় ভ্রমণ করবে এবং / অথবা আপনার কোডটিকে এর মতো দেখায় এটিতে যখন নবজাতকের বাগ থাকে তখন এটি সত্য হয়।
এবং আপনি যখন এটি সম্পর্কে ভাবেন তখন কোডটি এর মতো করুন:
switch(x)
{
case 1:
foo();
/* FALLTHRU */
case 2:
bar();
break;
}
হয় কিছু যোগ পতনের মাধ্যমে কোডে স্পষ্ট করতে, এটা ঠিক এমন কিছু বিষয় যা সনাক্ত করা যাবে (অথবা যার অনুপস্থিতি সনাক্ত করা যাবে) কম্পাইলার দ্বারা নয়।
এ হিসাবে, সি # তে পতনের মাধ্যমে এই বিষয়টি স্পষ্ট হওয়া উচিত যে যারা অন্য সি-স্টাইল ভাষায় ভাল লিখেছেন তাদের পক্ষে কোনও জরিমানা যুক্ত হয় না, যেহেতু তারা ইতিমধ্যে তাদের পতনের মধ্য দিয়ে স্পষ্ট হয়ে উঠবে। †
অবশেষে, এখানকার ব্যবহার goto
ইতিমধ্যে সি এবং অন্যান্য ভাষা থেকে একটি আদর্শ:
switch(x)
{
case 0:
case 1:
case 2:
foo();
goto below_six;
case 3:
bar();
goto below_six;
case 4:
baz();
/* FALLTHRU */
case 5:
below_six:
qux();
break;
default:
quux();
}
এই ধরণের ক্ষেত্রে যেখানে আমরা চাইছি যে কোনও ব্লককে কোডটির সাথে সম্পাদিত কোডের মধ্যে অন্তর্ভুক্ত করা উচিত ঠিক এটির চেয়ে অন্য কোনও মান যা পূর্ববর্তী ব্লকে একটি উপস্থিত করে, তারপরে আমাদের ইতিমধ্যে ব্যবহার করতে হবে goto
। (অবশ্যই, বিভিন্ন শর্তসাপেক্ষে এটি এড়ানোর উপায় এবং উপায় রয়েছে তবে এটি এই প্রশ্নের সাথে সম্পর্কিত সমস্ত বিষয়ে সত্য)। যেমন একটি # ইতিমধ্যে একটি সাধারণ পরিস্থিতি যেখানে আমরা একটিতে কোডের একাধিক ব্লক হিট করতে চাই এবং সেখানে switch
পতনের মধ্য দিয়ে কভার করার জন্য এটি সাধারণীকরণের জন্য সাধারণ পদ্ধতিতে নির্মিত। এটি দুটি ক্ষেত্রেই আরও সুবিধাজনক এবং স্ব-ডকুমেন্টিং তৈরি করেছে, যেহেতু আমাদের সিতে একটি নতুন লেবেল যুক্ত করতে হবে তবে case
লে # হিসাবে সি # তে ব্যবহার করতে পারবেন । সি # তে আমরা below_six
লেবেল থেকে মুক্তি পেতে পারি এবং এর জন্যgoto case 5
আমরা কী করছি তা পরিষ্কার(আমাদেরও যোগ করতে হবেbreak
এর জন্য default
, যা আমি উপরের সি কোডটি পরিষ্কারভাবে সি # কোড নয়) তৈরি করতে রেখেছি।
সংক্ষেপে তাই:
- সি # ৪০ বছর আগে সি কোড যেমন করেছিলেন ঠিক তেমনই বিনা প্রতিরোধী সংকলক আউটপুটটির সাথে সম্পর্কিত নয়, যা পড়ে না-পড়ে অপ্রাসঙ্গিকতার অন্যতম অনুপ্রেরণা তৈরি করে।
break
অনুরূপ ভাষাগুলির সাথে পরিচিতদের দ্বারা ভাষা আরও সহজ শেখার জন্য এবং সহজ পোর্টিংয়ের জন্য সি # কেবল অন্তর্নিহিত না থাকার ক্ষেত্রে সি এর সাথে সামঞ্জস্যপূর্ণ রয়েছে ।
- সি # সম্ভবত চার দশক ধরে সমস্যার কারণ হিসাবে ভালভাবে নথিভুক্ত বাগ বা ভুল বোঝাবুঝি কোডের একটি সম্ভাব্য উত্স সরিয়ে দেয়।
- সি # কম্পাইলার দ্বারা সি (দস্তাবেজের মাধ্যমে পড়া) প্রয়োগ করে কার্যকর সর্বোত্তম অনুশীলন করে।
- সি # আরও স্পষ্ট কোড সহ অস্বাভাবিক কেসটিকে এক করে তোলে, স্বাভাবিক ক্ষেত্রে যে কোডটি কেবল একটি স্বয়ংক্রিয়ভাবে লিখে থাকে।
- সি # তে
goto
বিভিন্ন case
লেবেল থেকে একই ব্লকটি হিট করার জন্য একই ভিত্তিযুক্ত পদ্ধতির ব্যবহার করে যা সি তে ব্যবহৃত হয় এটি এটি অন্য কিছু ক্ষেত্রে সাধারন করে তোলে।
- বিবৃতিতে লেবেল হিসাবে কাজ করার
goto
অনুমতি দিয়ে সি # যে- ভিত্তিক পদ্ধতিকে সি-এর তুলনায় আরও সুবিধাজনক এবং পরিষ্কার করে তোলে case
।
সব মিলিয়ে একটি দুর্দান্ত যুক্তিসঙ্গত সিদ্ধান্ত
* বেসিকের কিছু ফর্ম কাউকে পছন্দ মতো করার অনুমতি দেয় GOTO (x AND 7) * 50 + 240
যা ভঙ্গুর অবস্থায় থাকে এবং তাই নিষিদ্ধের জন্য একটি বিশেষ প্ররোচিত মামলা goto
, নিম্ন-স্তরের কোডটি যেভাবে তৈরি করতে পারে তার উপর ভিত্তি করে উচ্চ-ভাষার সমতুল্য দেখায় serve গাণিতিক একটি মানের উপর নির্ভর করে, যা ম্যানুয়ালি বজায় রাখতে হয় এমন কিছুের চেয়ে সংকলনের ফলাফল যখন অনেক বেশি যুক্তিসঙ্গত। বিশেষত ডাফের ডিভাইসের প্রয়োগগুলি সমতুল্য মেশিন কোড বা আইএলকে তাদের ভাল ndণ দেয় কারণ নির্দেশাবলীর প্রতিটি ব্লক প্রায়শই nop
ফিলারগুলির সংযোজন ছাড়াই একই দৈর্ঘ্যের হয়ে থাকে ।
† ডাফের ডিভাইসটি এখানে যুক্তিসঙ্গত ব্যতিক্রম হিসাবে আবার উপস্থিত হবে। এই যে এবং একই ধরণের নিদর্শনগুলির সাথে ক্রিয়াকলাপগুলির পুনরাবৃত্তি হ'ল ফলটির স্পষ্টভাবে কোনও মন্তব্য না করেও অপেক্ষাকৃত স্বচ্ছলতার ব্যবহার কার্যকরভাবে দেখাতে পারে।