if ('ধ্রুবক' == $ পরিবর্তনশীল) বনাম যদি ($ ভেরিয়েবল == 'ধ্রুবক')


49

ইদানীং, আমি পিএইচপি এবং বিশেষত ওয়ার্ডপ্রেস কাঠামোর মধ্যে অনেক কাজ করছি। আমি আকারে প্রচুর কোড লক্ষ্য করছি:

if ( 1 == $options['postlink'] )

যেখানে আমি আশা করতাম

if ( $options['postlink'] == 1 )

এটি কি কোনও ভাষা / ফ্রেমওয়ার্কগুলিতে পাওয়া যায়? পূর্ববর্তী পদ্ধতির উত্তরগুলির চেয়ে ভাল হওয়ার কোনও কারণ আছে (প্রক্রিয়াজাতকরণের দৃষ্টিভঙ্গি, বা পার্সিং দৃষ্টিকোণ বা এমনকি কোনও মানবিক দৃষ্টিকোণ থেকে?)

নাকি এটি নিছক স্বাদের বিষয়? পরীক্ষা করার সময় আমি সবসময় এটি আরও ভালভাবে ভেবে দেখেছি যে কিছু ধ্রুবকের বিরুদ্ধে পরীক্ষা করা ভেরিয়েবল আইটেমটি বামদিকে রয়েছে। আমরা প্রাকৃতিক ভাষায় যেভাবে প্রশ্নটি জিজ্ঞাসা করব তার থেকে এটি আরও ম্যাপের মতো মনে হচ্ছে: "যদি কেক চকোলেট হয়" বরং "যদি চকোলেট হ'ল কেক"।


1
আমি এর মতো কোডটি কখনও লিখি না তবে ফর্সা হতে "যদি চকোলেটটি কেকের স্বাদ হয় তবে" এটি প্রাকৃতিক শোনাচ্ছে। প্রাকৃতিক ভাষা আরও নমনীয়।
রিক স্ল্যাডকি

4
@ রিক এটি ভাষায় প্রাকৃতিক শোনাচ্ছে তবে আপনি এটি অস্বীকার করতে পারবেন না যে আপনি যখন কোডটি দেখেন তখন আপনাকে প্রথমে (সম্ভবত কেবল এক সেকেন্ডের জন্য) থামাতে হবে এটি কী করার চেষ্টা করছে তা ভাবতে।
এডগার গঞ্জালেজ

4
@ অ্যাডগার গঞ্জালেজ: একমত, আমি কোডে দৃ firm়তার সাথে।
রিক স্ল্যাডকি

3
কোড সম্পূর্ণ দ্বিতীয় সংস্করণের 19 তম অধ্যায় ("বুলিয়ান এক্সপ্রেশন: বিভাগের অধীনে বুলিয়ান এক্সপ্রেশনগুলির সাধারণ সমস্যা") এখানে বেশ কয়েকটি উত্তরে বর্ণিত যথাযথ কারণে এই অনুশীলনটির সুপারিশ করে: সি-প্রাপ্ত ভাষায় অ্যাসাইনমেন্ট আটকাতে যখন তুলনা করা হয়েছিল ।
ক্রেগটিপি

4
আমি প্রায়শই এগুলিকে "Yoda অবস্থা" হিসাবে উল্লেখ করেছি
ব্রায়ান

উত্তর:


84

এটি করার জন্য প্রধান কারণ (তথাকথিত "ইয়োদা শর্তসাপেক্ষ") এমন দুর্ঘটনা প্রতিরোধ করা যাতে আপনি দুর্ঘটনাক্রমে =সমান তুলনা অপারেটর ( ==) এর পরিবর্তে একটি অ্যাসাইনমেন্ট অপারেটর ( ) ব্যবহার করেন ।

এটি হল, আপনি যদি ভুলটি করেন তবে:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

বিবৃতিটি মূল্যায়ন করবে true(বা কিছু ভাষার ক্ষেত্রে যেমন পিএইচপি-এর মতো সত্যবাদী মান) এবং আপনার কাছে একটি হার্ড-টু-বগ বাগ থাকতে হবে।

তবে আপনি যদি:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

আপনি একটি মারাত্মক ত্রুটি পাবেন কারণ আপনি $fooকোনও পূর্ণসংখ্যাকে বরাদ্দ করতে পারেন না ।

তবে আপনি যেমন উল্লেখ করেছেন, ক্রমটি বিপরীত করা সাধারণত জিনিসগুলি কম পাঠযোগ্য হয়। সুতরাং, অনেক কোডিং মান (তবে ওয়ার্ডপ্রেস সহ সমস্ত নয় ) $foo == 1এর বাগ শিকারের সুবিধার পরেও পরামর্শ বা প্রয়োজন 1 == $foo

সাধারণত, আমার পরামর্শটি হ'ল প্রতিষ্ঠিত কোডিং মানটি যা আছে সেখানে অনুসরণ করুন, যদি সেগুলি থাকে: ওয়ার্ডপ্রেসের জন্য, এর অর্থ হ'ল যোদা শর্তাদি using

যখন সেখানে নেই এবং আপনার সমবয়সীদের সাথে sensকমত্যের মাধ্যমে একটি স্থাপন করা অসম্ভব, তখন এটি ডিলারের পছন্দ।


2
আমি মনে করি একটি ভাষা ডিজাইন করার সময় (অনেক আগে) যে বিশেষত এই ধরণের ঝামেলা এড়ানোর জন্য আমরা বিশেষ :=করে অ্যাসাইনমেন্ট অপারেটর ( ==সমতা পরীক্ষার জন্য ) হয়েছি ।
ডোনাল ফেলো

7
আমি কোডের অনেকগুলি, অনেকগুলি লাইন লিখেছি এবং আমি কখনও দুর্ঘটনাক্রমে =পরিবর্তে টাইপ করিনি== । পার্থক্যটি সর্বত্র উচ্চারিত যে আমি তাদের কখনই বিভ্রান্ত করি নি। অন্যদিকে, আমি কোডের অনেকগুলি টুকরো পড়েছি যা বিভ্রান্তিকর বা অন্যথায় বোঝা শক্ত। এর মতো, আমি পঠনযোগ্যতার উপর অগ্রাধিকার রাখব :)। নির্বিশেষে, ভাল উত্তর।
পাগল 2

5
তবুও ব্যবহারের অন্য একটি ভাল কারণ -Wall -Werrorবা আপনার সংকলক / দোভাষী এর সমতুল্য। খুব কম পরিস্থিতি রয়েছে যেখানে শর্তের মধ্যে একটি অ্যাসাইনমেন্ট সঠিক হয়, আরও পড়ার মতো ছেড়ে দিন। অনেকগুলি ভাষা এমনকি এটির অনুমতি দেয় না।
কার্ল বিলেফেল্ট

7
পেডেন্টিক: কিছু ভাষায় if($foo = 1)মূল্যায়ন করার সময় true, পিএইচপিতে এটি পরিবর্তে 1 এ মূল্যায়ন করে; if($foo = 20)20 এ মূল্যায়ন; if($foo = 0)0 এ মূল্যায়ন করে, যা অন্যদের মতো অসত্য। এটি বাগের মধ্যে জটিলতার পুরো 'নটর স্তর যুক্ত করতে পারে।
চার্লস

2
প্রকৃতপক্ষে, ওয়ার্ডপ্রেস কোডিং স্ট্যান্ডার্ডগুলি যোদা
টম

13

এটি একটি প্রতিরক্ষামূলক কোডিং প্রক্রিয়া যার অর্থ অ্যাসাইনমেন্ট অপারেটরের দুর্ঘটনাজনিত ব্যবহার রোধ করা।

সাম্যতা অপারেটরের জায়গায় অ্যাসাইনমেন্ট অপারেটরের অপব্যবহার / ত্রুটি বিবেচনা করুন

if ( $options['postlink'] = 1  )

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

if( 1 = $options['postlink'])

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


9

আমি সেই কনভেনশনটি জাভাতে ব্যবহার করে নাল পয়েন্টার ব্যতিক্রমের সম্ভাবনাটি সরাতে চাই। সুতরাং এর মতো কিছু আপনাকে কোনও সমস্যা তৈরি করবে না বা কোনও অতিরিক্ত কোডের প্রয়োজন হবে না:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}

3
আমি এটি পছন্দ করি তবে আমি সাধারণ প্রতিমাটিকে ঘৃণা করি।
টমাস এডিং

3
যদি কোডটির সেই বিন্দু অনুসারে নাল মানটি বৈধ না হয় তবে আপনার আগে থেকেই এটির জন্য চেক করা উচিত ছিল বা আপনার কোডটি এমনভাবে ডিজাইন করা উচিত ছিল যে নাল মানটি অসম্ভব।
এড এস।

6
এটি সমস্যার মুখোশের সহজ উপায় বলে মনে হচ্ছে। ধুসরগুলি কার্পেটের অভ্যন্তরে টেনে নিয়ে পরিষ্কার করা হয় না।
মিথ্যা রায়ান

0

অনুশীলনে, অনেক সংকলক আপনাকে একটি সতর্কতা দেবে যদি আপনি "যদি (x = 1)" এর পরিবর্তে "যদি (x == 1)" লিখেন তবে সম্ভবত এটি একটি ভুল is

ক্ল্যাংয়ের মাধ্যমে, আপনি সংক্ষেপককে "আমি এটি বোঝাতে চাইছি, এবং আমি জানি আমি কী করছি" বলে কার্যকরভাবে সতর্কতাটি এড়াতে পারেন, এবং এটি "যদি ((x = 1))" লিখে তৈরি করা হয়। অতিরিক্ত বন্ধনী নোট করুন। এটি অন্যান্য পরিস্থিতিতেও কাজ করে। যদি (মিথ্যা) বিবৃতি; আপনাকে একটি সতর্কতা দিতে পারে যে বিবৃতিটি কখনও কার্যকর হয় না; যদি ((মিথ্যা)) বিবৃতি; যে সতর্কতা দেয় না।


আমি ওটা অনেক পছন্দ করি! আমি পিএইচপি-তে নিম্নলিখিত বিষয়গুলি সম্পূর্ণরূপে এড়াতে পারি কারণ আমি সর্বদা আমার আইডিইতে সতর্কতা পাই:if ($array = getSomething()){ // ..so something with $array }
টম অগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.