শর্তাধীন (পজিশন <আকার) কেন এমন প্রচলিত প্যাটার্ন?


9

শর্ত বিবৃতিতে (আইএফ) প্রত্যেকে ব্যবহার করে (position < size)তবে কেন?
কেবল কনভেনশনই নাকি এর জন্য কোনও ভাল কারণ আছে?

বন্য খুঁজে পাওয়া যায়:

if (pos < array.length) {
   // do some with array[pos];
}

কদাচিৎ পাওয়া গেছে:

if (array.length > pos) {
   // do some with array[pos];
}

7
এক ক্ষেত্রে যেখানে আমি ডান দিকে "পরিবর্তনশীল" থাকার কিছু মনে না if (MIN <= x && x <= MAX)। ( কিছু ভাষায় এটি লিখিত হতে পারে MIN <= x <= MAX; সি তে, এটি পুরোপুরি আইনী তবে এর অর্থ এই নয় যে আপনি এর অর্থ কী হতে পারে)।
কিথ থম্পসন


5
অন্তরগুলি কীভাবে লেখা হয় [min, max]এবং কীভাবে তা সম্পর্কিত হতে পারে [max, min]। সুতরাং, কোনও উপাদানটি xলেখার মধ্যবর্তী ব্যবস্থার সাথে সম্পর্কিত কিনা তা পরীক্ষা করা স্বাভাবিক min <= x <= max
আন্দ্রেস এফ।

কি সুন্দর।
তুলিনস কর্ডোভা

দ্বিতীয় উদাহরণটি আরও স্পষ্ট করে বলা যেতে পারে যেন (! (অ্যারে.রেঞ্জ <= পোস্ট)) ...
ওল্ডফার্ট

উত্তর:


48

গভীর নিদর্শনটি হ'ল আমরা প্রাকৃতিকভাবে "[[যে পরিবর্তিত জিনিস] পরিবর্তিত হয়]] [তুলনা] [জিনিসটি যে পরিবর্তিত হয় না]" মান ক্রম হিসাবে ব্যবহার করি। এই নীতিটি আপনার উদাহরণের জন্য সত্য, কারণ পজিশনে ভিন্নতা থাকতে পারে, যখন আকারটি হবে না।

একমাত্র সাধারণ ব্যতিক্রম হ'ল সাম্যের জন্য পরীক্ষা করার পরে কিছু প্রোগ্রামাররা বাগের চেয়ে সাধারণ এড়াতে বিপরীত ক্রমটি ( যোদা শর্ত হিসাবে পরিচিত ) ব্যবহার করার প্রশিক্ষণ দেয় - আমি এই ধারণাকে ধরে রাখি না কারণ বর্ণিত প্রাকৃতিক ক্রমটি আমি খুঁজে পেয়েছি সর্বোপরি আরও পঠনযোগ্য, প্রাথমিকভাবে কারণ আমরা ইংরেজিতে ধারণাটি প্রকাশ করি এবং বেশিরভাগ আধুনিক সংকলকরা এটি সনাক্ত করে একটি সতর্কতা জারি করবে।variable = constantvariable == constant


3
আপনার বিকাশের সরঞ্জামগুলির উপর নির্ভর করে, অনেকে variable = constantনির্মাণে সতর্কতা (বা ত্রুটি) দেবেন will
গ্যালাকটিক

5
+1 টি। constant == variableঘটনাটি সম্পর্কে আরও তথ্যের জন্য "Yoda শর্তাবলী" অনুসন্ধান করুন ।
জন এম গ্যান্ট

আমি এই একই জিনিস সম্প্রতি আমার নিজের কোড বেস (যেমন দেখা করেছি if(DBNull == row["fieldName"]) methodCall()এবং বিস্ময়ের উদ্রেক যদি আমি পাগল কারণ অধিকাংশ সময় আমি করেছি দেখা এটি অন্যান্য উপায় কাছাকাছি সম্পন্ন যাচ্ছে।
অ্যান্ড্রু গ্রে

1
আমি এটি যুক্ত করব যা (position < size)প্রায়শই একটি উপরের lowerbound <= position < upperboundবাউন্ডকে প্রকাশ করে, তাই ফলস্বরূপ এটি অংশটির বিশ্রাম নিয়ে থাকে, উপরের দিকের আকার হিসাবে। দুটি সীমাবদ্ধতা স্পষ্টতই, positionকেবলমাত্র মাঝখানে যেতে পারে।
স্টিভ 314

4
এটি সম্ভবত ভাষার সাথে সম্পর্কিত; আমরা " এক্স অপারেটর ওয়াই " কে " এক্স ইজ ( অপারেটর ওয়াই )" হিসাবে পার্স করি , যেমন সম্পর্কটি এক্স এর একটি বৈশিষ্ট্য । তুলনা জিজ্ঞাসা করে, আমরা জিজ্ঞাসা করছি যে এক্স এর ভাল বা খারাপ মান আছে (এবং Y স্থানীয়ভাবে একটি ধ্রুবক হিসাবে বিবেচিত হয়)। "পোস্ট <অ্যারে। দৈর্ঘ্য" জিজ্ঞাসা করা জিজ্ঞাসার মতো অনুভব করে: "অবস্থান কি ঠিক আছে (অ্যারের দৈর্ঘ্যের চেয়ে ছোট)?" যদি না হয় তবে অবস্থান সম্পর্কে কিছু ভুল আছে; আমাকে অন্য একটি অবস্থান দিন এবং আপনি যা চান তা করতে পেরে আমি খুশি হব। কিন্তু অ্যারের দৈর্ঘ্য সম্পর্কে কিছুই ভুল নয়। "অ্যারে। দৈর্ঘ্য> পোজ" জিজ্ঞাসা করে মনে হচ্ছে অ্যারেটি খুব কম হলে আমাদের বাড়ানো উচিত।

14

আমি এর জন্য কেবলমাত্র ন্যায়সঙ্গততা দেখেছি এটি স্কুলে আমরা শিখেছি নম্বর লাইন বা অন্যান্য ক্রমযুক্ত জিনিসগুলির মতো। উদাহরণস্বরূপ, আমরা এই জাতীয় নম্বর লিখি:

<--|--|--|--|--|--|-->
   1  2  3  4  5  6

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

এটি মূলত কীভাবে আমরা জিনিসগুলির ক্রম সম্পর্কে প্রাকৃতিকভাবে চিন্তা করি তা সম্পর্কে ফোটে। প্রথম ফর্মটি পড়া সহজ কারণ এটিতে আপনাকে বেশি মানসিক প্রসেসিং করতে হবে না।


1
আপনি বলতে চাচ্ছেন যে ক্ষুদ্রতর মানের সাথে মূল্যায়ন করা শর্তটি প্রথমে আসে? আপনি কীভাবে নিশ্চিত হতে পারেন যে মানগুলি একটি রানটাইম পরিবর্তিত হলে তা সত্য হবে?
তুলাইনস কর্ডোভা

@ user61852 রানটাইমের সময় মানগুলি কী তা আপনার জানা দরকার। উদাহরণস্বরূপ: আমার 2 টি মান রয়েছে যা আমি রানটাইম মান A এবং মান B তে গণনা করি এবং আমি পরীক্ষা করতে চাই যে মান AA মান ভ্যালুর চেয়ে ছোট। আমি "if (valueA <valueB)" লিখতাম। ভ্যালুএ এর চেয়ে ছোট হওয়া মান শেষ না হওয়া পারা যায় না। এটি দেখার পক্ষে এটি সহজ (কমপক্ষে আমার জন্য) এবং জানুন যে আমি যখন ভ্যালুএ এর চেয়ে ছোট মানের বি চেয়ে ছোট হয় তখন আমি সন্ধান করি। যদি আমি "if (valueB> valueA)" দেখতে পাই তবে আমি কোডের এই শাখাটি অনুসরণ করতে চলেছি তখন আমাকে কোন জিনিসটি ছোট জিনিস তা নিয়ে থামতে হবে এবং ভাবতে হবে।
বেকুজ

1
আমি ভুল বুঝেছিলাম. আমি উত্তরটি নিচে ভোট দিয়েছি। এখন আমি এটিতে ভোট দিতে চাই, তবে সাইটটি উত্তরটি সম্পাদনার জন্য দাবি করেছে যাতে আমি আমার ভোট পরিবর্তন করতে পারি। দয়া করে কিছু সম্পাদনা করুন যাতে আমি এটিতে ভোট দিতে পারি।
তুলাইনস কর্ডোভা

@ user61852 আপনার এখনই আপনার ভোট পরিবর্তন করতে সক্ষম হওয়া উচিত।
বেকুজ

11

যদিও এটি মূলত সম্মেলনের বিষয়, এটি আমার মতামত যে আমাদের বিবেচনার সাথে এটি সবচেয়ে ভাল মেলে - এটি সেই আইটেমটি দেখায় যা আমরা জোর দিয়েছি।

যদি আমরা এগুলিকে ইংরেজী অনুবাদ করি তবে এটি "যদি অবস্থানটি অ্যারের দৈর্ঘ্যের চেয়ে কম হয়" বাক্যটি হবে, যেখানে বাক্যের বিষয়টি ক্ষণস্থায়ী আইটেম।

এটিকে অন্যভাবে প্রকাশ করার জন্য, "যদি অ্যারের দৈর্ঘ্য অবস্থানের চেয়ে বেশি হয়" বিষয়টিতে অ্যারের দৈর্ঘ্য (একটি নির্দিষ্ট মান হিসাবে ধরে নেওয়া হয়) রাখে এবং অবস্থান (ক্ষণস্থায়ী) সরাসরি বস্তুতে পরিণত হয়।


3
প্রকৃতপক্ষে (আপনার শেষ বাক্যে) অবস্থানটি একটি পূর্ববর্তীর অবজেক্টে পরিণত হয়। তবে আপনি যা বলতে চাইছেন তাতে আমি একমত। ভাষাতত্ত্বের ক্ষেত্রে আমরা বলব যে অবস্থানটি বিষয় , এবং "অ্যারের দৈর্ঘ্যের চেয়ে কম" মন্তব্য । "বিষয়ভিত্তিক উপাদান বাক্য-প্রারম্ভিক (বিষয় ফ্রন্টিং) রাখার প্রবণতা ব্যাপক।" en.wikipedia.org/wiki/...
LarsH

4

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

এটি অর্ধ-খালি বনাম অর্ধ-পূর্ণ আলোচনার মতো। গাণিতিকভাবে অভিন্ন, তবে আমার মস্তিষ্ক প্রসঙ্গের উপর নির্ভর করে সেগুলি আলাদাভাবে দেখবে।

ব্যক্তিগতভাবে, যদি আমি দেখতে পাই

if (array.lengh > pos) {
    // do some with array[pos];
}

আমি এটি একটি বাগ কিনা এবং প্রোগ্রামার বলতে কী বোঝায় তা নিয়ে ভাবতে শুরু করব। সে কি বাউন্ডস-চেকিং ছাড়া অন্য কিছু করার চেষ্টা করছে?

হতে পারে আমি কেবল উজ্জ্বল নই, তবে কোডের প্রতিটি লাইনে যদি আমাকে এই জাতীয় বিশ্লেষণ করতে হয় তবে আমার মস্তিষ্ক ব্যাথা করে।


3

কেউ কেউ কী পেতে চেষ্টা করেছেন তা প্রকাশ করার জন্য, অন্যভাবে ...

ক্রমটি যখন প্রোগ্রামটির আচরণে কোনও তাত্পর্যপূর্ণ করে না, তখন পার্থক্যটি স্পষ্টভাবে একটি বিষয় যা মানুষের কাছে সবচেয়ে বেশি পাঠযোগ্য। এখানে "টপিক" বাম দিকে রাখার একটি ভাষাগত কারণটি বোঝায়:

ভাষাতত্ত্বের ক্ষেত্রে, একটি বাক্যটির বিষয়টিই সেই বিষয়ে কথা বলা হচ্ছে, এবং মন্তব্যটি বিষয় সম্পর্কে যা বলা হচ্ছে তা। এই উদাহরণে, আমরা অনুমান করতে পারি যে positionএটি বিষয় , এবং "অ্যারের দৈর্ঘ্যের চেয়ে কম" মন্তব্য । ইংরাজীতে এবং অন্যান্য অনেক ভাষায়, বিষয়টি সাধারণত মন্তব্যের আগে প্রকাশ করা হয়।
" বিষয়ভিত্তিক উপাদান বাক্য-প্রারম্ভিক (বিষয় ফ্রন্টিং) রাখার প্রবণতা ব্যাপক। "

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


1

এটি দুটি জিনিসের সংমিশ্রণ, উভয়ই অন্তর্নিহিত এসেম্বেবলার থেকে আগত যে প্রাথমিক ভাষাগুলি সংকলিত হয়েছে (এবং প্রচুর বর্তমানেরও)।

  1. অ্যারেগুলি মেমোরিতে শূন্য-ভিত্তিক অফসেট (অর্থাত প্রথম অংশটি বরাদ্দ মেমরি ব্লকের শুরুতে হয় ... 0-সূচক)। অতএব পরিবর্তিত টুকরা জন্য 0..n-1 ব্যবহার করুন।

  2. মানটি যদি অন্য মানের (বা নিবন্ধক ইত্যাদি) এর চেয়ে কম হয় তবে সাধারণত একটি একক নির্দেশ। অতএব সরল কম-বেশি (<) অপারেটরের ব্যবহার।

সুতরাং, প্যাটার্নটি পুরানো-কালীন এসেম্বলারের কাছ থেকে এএনএসআই-সিতে স্থানান্তরিত হয়েছে (যা কিছু উপায়ে ম্যাক্রো এসেম্বলারের মতো) এবং সেখান থেকে জাভা এবং অন্যান্য সি-মতো ভাষায় চলে গেছে।


0

অন্যান্য অনেক উত্তর যেমন বলেছে, এটি পড়তে খুব সহজেই:

[thing that varies] [comparison] [thing that does not vary]

আমার পরিচিত প্রায় সবাই এই স্টাইলটি একচেটিয়াভাবে ব্যবহার করে।

সি-স্টাইলের ভাষাগুলির ক্ষেত্রে একটি ব্যতিক্রম রয়েছে যা =অ্যাসাইনমেন্ট এবং ==তুলনা করার জন্য ব্যবহার করে । আপনি যদি দুর্ঘটনাক্রমে টাইপ করেন:

if (variable = 5) ...

পরিবর্তে:

if (variable == 5) ...

তাহলে আপনি কোনও ত্রুটি পাবেন না কারণ এটি কোডের একটি বৈধ লাইন। (কিছু সংকলক এবং IDEs আপনাকে এটি সম্পর্কে সতর্ক করবে, তবে এত সহজ টাইপ পাওয়া এখনও খুব সহজ))

তবে আপনি যদি লিখেন:

if (5 == variable) ...

সংকলক / দোভাষা ত্রুটি করবে কারণ এটি একটি বৈধ নির্মাণ নয় (বেশিরভাগ ভাষায়, যাইহোক)।

এই স্যুইচ-চারদিকে প্রায়শই যোদা শর্ত বলে

আপডেট : এখানে এমন জায়গাগুলির একটি তালিকা রয়েছে যেখানে ইয়োদা শর্তগুলি কার্যকর


-1

ব্যক্তিগতভাবে, আমি এটি পছন্দ করি:

bool positionIsWithinBounds = pos < array.length;
if (positionIsWithinBounds) {
   // do some with array[pos];
}

... এটি আরও কোড, তবে এটি পড়া খুব সহজ।


4
তুলনাটি একটি নাম দেওয়ার জন্য +1। সত্যই, যদিও, আমি আরও জটিল শর্তসাপেক্ষে এই পদ্ধতির চেয়ে ভাল পছন্দ করি এবং এর মতো সরল মামলার ক্ষেত্রে তেমন কিছু না। এটা আসলে আমাকে "অ্যারে" সম্পর্কে চিন্তা করা বন্ধ করে তোলে, "সীমা", "মধ্যে", এবং কি ঐ সমস্ত গড়, যখন আমি অমনটা জানেন কি এটা জন্য মানে posহতে > array.length। অন্য কথায়, যদিও এটি শর্তাধীনটির অর্থ খুব স্পষ্ট করে তোলে, এটি আসলে আইএমওটি পড়তে কিছুটা শক্ত করে তোলে।
জন এম গ্যান্ট

তবুও অন্য নাম রাখার ...
হস্তান্তরকারী

-1

এটি পছন্দ বা সম্মেলনের বিষয়। আপনি যদি সামঞ্জস্য বজায় রাখতে চান তবে দুটি সমান যুক্তিসঙ্গত উপায় রয়েছে যা সম্পর্কে আপনি যেতে পারেন:

  1. সর্বদা "বিষয় "টিকে প্রথমে রাখুন (এটিকে বাক্য হিসাবে ভাবেন) - পরীক্ষাটি যে মানটির বিষয়ে। সুতরাং উদাহরণস্বরূপ আপনি লিখতে চাইif (age>5)

  2. বা সর্বদা ছোট উপাদানটিকে প্রথমে রাখুন (প্রাকৃতিক ক্রমে আপনার পর্দায় মানগুলি আদেশ করা হয় বলে এটি ভাবেন)। সুতরাং উদাহরণস্বরূপ আপনি if (a<b)এই কোডটি বেশিরভাগ সম্পর্কে একটি বা বেশিরভাগ বি সম্পর্কে কিনা তা নির্বিশেষে লিখতে চাই ।

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

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