আমি অপ্রিয় হতে চলেছি এবং হ্যাঁ বলছি, এটি খারাপ অভ্যাস। যদি আপনার কোডটির কার্যকারিতা শর্তযুক্ত যুক্তি প্রয়োগ করতে এটির উপর নির্ভর করে।
অর্থাত
if(quickLogicA && slowLogicB) {doSomething();}
ভাল, কিন্তু
if(logicA && doSomething()) {andAlsoDoSomethingElse();}
খারাপ, এবং অবশ্যই কারও সাথে একমত হবে না ?!
if(doSomething() || somethingElseIfItFailed() && anotherThingIfEitherWorked() & andAlwaysThisThing())
{/* do nothing */}
যুক্তি:
উভয় পক্ষকে কেবল যুক্তি সম্পাদন না করার পরিবর্তে যদি মূল্যায়ন করা হয় তবে আপনার কোড ত্রুটিগুলি। যুক্তি দেওয়া হয়েছে যে এটি কোনও সমস্যা নয়, 'এবং' অপারেটর সি # তে সংজ্ঞায়িত হয়েছে সুতরাং অর্থটি পরিষ্কার। তবে, আমি দাবি করি যে এটি সত্য নয়।
কারণ 1. orতিহাসিক
মূলত আপনি আপনার কোডটিতে কার্যকারিতা সরবরাহ করার জন্য একটি সংকলক অপ্টিমাইজেশনের উপর নির্ভর করছেন (মূলত যার উদ্দেশ্য ছিল)।
যদিও সি # তে ভাষা নির্দিষ্টকরণ বুলিয়ান গ্যারান্টি দেয় 'এবং' অপারেটর শর্ট সার্কিট করে। এটি সমস্ত ভাষা এবং সংকলকগুলির ক্ষেত্রে সত্য নয়।
উইকিপিডায় বিভিন্ন ভাষাগুলির তালিকা রয়েছে এবং তাদের শর্ট সার্কিট http://en.wikedia.org/wiki/Short-circuit_e মূল্যায়ন হিসাবে আপনি নিতে পারেন অনেকগুলি পদ্ধতির তালিকা করে। এবং বেশ কয়েকটি অতিরিক্ত সমস্যা আমি এখানে প্রবেশ করি না।
বিশেষত, ফরট্রান, পাস্কেল এবং ডেলফির সংকলক পতাকা রয়েছে যা এই আচরণটি টগল করে।
অতএব: আপনি মুক্তির জন্য সংকলিত হওয়ার সময় কোডটি কাজ করতে পারেন তবে ডিবাগ বা বিকল্প সংকলক ইত্যাদির সাথে নয় etc.
কারণ 2. ভাষার পার্থক্য
আপনি উইকিপিডিয়া থেকে দেখতে পাচ্ছেন, বুলেটিয়ান অপারেটররা কীভাবে এটি পরিচালনা করতে হবে তা নির্দিষ্ট করে দেওয়া সত্ত্বেও সমস্ত ভাষা শর্ট সার্কিটের ক্ষেত্রে একই পন্থা নেয় না।
বিশেষত ভিবি.নেটের 'এবং' অপারেটরের শর্ট সার্কিট হয় না এবং টিএসকিউএল কিছু বিশেষত্ব রয়েছে।
প্রদত্ত যে একটি আধুনিক 'সমাধান' সম্ভবত জাভাস্ক্রিপ্ট, রেজেক্স, এক্সপ্যাথ ইত্যাদির মতো অনেকগুলি ভাষা অন্তর্ভুক্ত করতে পারে যখন আপনার কোড কার্যকারিতা স্পষ্ট করার সময় আপনার এটিকে বিবেচনা করা উচিত।
কারণ ৩. কোনও ভাষার মধ্যে পার্থক্য
উদাহরণস্বরূপ, ভিবি'র ইনলাইন যদি এর থেকে আলাদা আচরণ করে if আবার আধুনিক অ্যাপ্লিকেশনগুলিতে আপনার কোডের মধ্যে সরে যেতে পারে উদাহরণস্বরূপ কোড এবং একটি ইনলাইন ওয়েবফর্ম, আপনাকে অর্থের পার্থক্য সম্পর্কে সচেতন হতে হবে।
কারণ ৪. কোনও ফাংশনের প্যারামিটারটি পরীক্ষা করা আপনার নালীর নির্দিষ্ট উদাহরণ
এটি একটি খুব ভাল উদাহরণ। এতে এটি প্রত্যেকেরই কিছু হয় তবে আপনি যখন এটি সম্পর্কে চিন্তা করেন তখন এটি আসলে খারাপ অভ্যাস।
এই ধরণের চেকটি দেখতে এটি খুব সাধারণ কারণ এটি আপনার কোডের লাইনগুলিকে যথেষ্ট হ্রাস করে। আমি সন্দেহ করি যে কোনও কোড পর্যালোচনা করে এটিকে সামনে আনবে। (এবং স্পষ্টতই মন্তব্য এবং রেটিং থেকে আপনি এটি জনপ্রিয় দেখতে পাবেন!)
তবে এটি একাধিক কারণে সেরা অনুশীলনে ব্যর্থ হয়!
এটি অসংখ্য উত্স থেকে একেবারে স্পষ্ট, সর্বোত্তম অনুশীলন হ'ল আপনার পরামিতিগুলি ব্যবহার করার আগে তাদের বৈধতার জন্য পরীক্ষা করা এবং সেগুলি অবৈধ হলে ব্যতিক্রম ছুঁড়ে ফেলা। আপনার কোড স্নিপেটটি আশেপাশের কোডটি দেখায় না, তবে আপনার সম্ভবত এমন কিছু করা উচিত:
if (smartphone == null)
{
//throw an exception
}
// perform functionality
আপনি এর থেকে একটি ফাংশন আহ্বান করা হয় মধ্যে শর্তসাপেক্ষ বিবৃতি। যদিও আপনার ফাংশনের নামটি বোঝায় যে এটি কেবল একটি মান গণনা করে, এটি পার্শ্ব প্রতিক্রিয়াগুলি আড়াল করতে পারে। যেমন
Smartphone.GetSignal() { this.signal++; return this.signal; }
else if (smartphone.GetSignal() < 1)
{
// Do stuff
}
else if (smartphone.GetSignal() < 2)
{
// Do stuff
}
সেরা অনুশীলন পরামর্শ দেবে:
var s = smartphone.GetSignal();
if(s < 50)
{
//do something
}
আপনি যদি আপনার কোডটিতে এই সেরা অনুশীলনগুলি প্রয়োগ করেন তবে দেখতে পাবেন যে গোপনীয় শর্তযুক্ত ব্যবহারের মাধ্যমে সংক্ষিপ্ত কোড অর্জনের আপনার সুযোগটি অদৃশ্য হয়ে যায়। সেরা অনুশীলন হ'ল স্মার্টফোনটি শূন্য থাকে এমন কেস পরিচালনা করা something
আমি মনে করি আপনি দেখতে পাবেন এটি অন্যান্য সাধারণ ব্যবহারের ক্ষেত্রেও এটি। আপনার মনে রাখতে হবে আমাদেরও রয়েছে:
ইনলাইন শর্তাদি
var s = smartphone!=null ? smartphone.GetSignal() : 0;
এবং নাল coalescence
var s = smartphoneConnectionStatus ?? "No Connection";
যা আরও স্পষ্টতার সাথে একই সংক্ষিপ্ত কোড দৈর্ঘ্যের কার্যকারিতা সরবরাহ করে
আমার সমস্ত পয়েন্ট সমর্থন করার জন্য অসংখ্য লিঙ্ক:
https://stackoverflow.com/questions/1158614/what-is-the-best-practice-in-case-one-argument-is-null
সি # তে কনস্ট্রাক্টর প্যারামিটারের বৈধতা - সেরা অনুশীলন
যদি নাল প্রত্যাশা না করে তবে কি নাল পরীক্ষা করা উচিত?
https://msdn.microsoft.com/en-us/library/seyhszts%28v=vs.110%29.aspx
https://stackoverflow.com/questions/1445867/why-would-a-language-not-use-short-circuit-evaluation
http://orcharddojo.net/orchard-resources/Library/DevelopmentGuidelines/BestPractices/CSharp
সংক্ষিপ্ত সার্কিটকে প্রভাবিত করে সংকলক পতাকাগুলির উদাহরণ:
ফরট্রান: "দর্শন | nosce ডিফল্টরূপে, সংকলক এক্সএল ফোর্টরান বিধিগুলি ব্যবহার করে নির্বাচিত যৌক্তিক অভিব্যক্তিগুলিতে শর্ট সার্কিট মূল্যায়ন করে। "ডিফল্টটি নাক ডাকা হয়।"
পাস্কাল: "বি - শর্ট সার্কিট মূল্যায়ন নিয়ন্ত্রণকারী একটি পতাকা নির্দেশনা short ব্যবহারকারীর ম্যানুয়ালে নথিভুক্ত) "।
ডেলফি: "ডেল্ফি ডিফল্টরূপে শর্ট সার্কিট মূল্যায়ন সমর্থন করে It OO OO $ বুলিভাল অফ} সংকলক নির্দেশিকা ব্যবহার করে এটি বন্ধ করা যেতে পারে।"