টেরিনারি না টের্নারি না? [বন্ধ]


186

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

এতে আপনার অনুভূতি কী? আপনি এটি ব্যবহার করে কোন আকর্ষণীয় কোডটি দেখেছেন?


22
কোনও কিছুর উকিল হ'ল সেই ব্যক্তি যিনি সেই জিনিসটিকে সমর্থন করেন।
ডগ ম্যাকক্লিয়ান

8
এটি পরিষ্কার হয়ে গেলে এটি ব্যবহার করুন, যখন বিভ্রান্ত হয় তখন এড়িয়ে চলুন। এটা রায় রায়। এটি কোডটিকে আরও পঠনযোগ্য করে তুলতে পারে তবে কেবল সহজ অভিব্যক্তির জন্য। সর্বদা এটির চেষ্টা করার চেষ্টা যতটা মারাত্মক তা নিরলসভাবে এড়ানো এড়ানো।
আবেল

3
আসলে, এটি শর্তসাপেক্ষ অপারেটর। একটি নিকট-থেকে-সদৃশ প্রশ্নটি হ'ল স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 25২৫৯73//২
ড্যানিয়েল দারানাস

আমি মাঝে মাঝে ব্যবহার করছিলাম x = x if x else yতবে তার সম্পর্কে জিজ্ঞাসা করা হয়েছিল এবং অন্যদের সাহায্যে বুঝতে পেরেছিলাম যে এটি সত্যিই মাত্র x = x বা y হ্রাস
স্ক্রাফি

4
এই জাতীয় প্রশ্নগুলি গঠনমূলক হিসাবে বিবেচনা করা উচিত নয়।
Ungeheuer

উত্তর:


243

এটি কেবল সাধারণ অভিব্যক্তির জন্য ব্যবহার করুন :

int a = (b > 10) ? c : d;

পড়তে বা বিভ্রান্ত করার মতো চেইন বা নেস্ট টেরেনারি অপারেটরগুলি ব্যবহার করবেন না :

int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;

তদ্ব্যতীত, টের্নারি অপারেটর ব্যবহার করার সময়, কোডটি এমনভাবে ফর্ম্যাট করা বিবেচনা করুন যাতে পাঠযোগ্যতার উন্নতি হয়:

int a = (b > 10) ? some_value                 
                 : another_value;

80
সম্পূর্ণ কয়েকটি বিবৃতিতে সম্পূর্ণরূপে একমত তবে আপনার "উন্নত পাঠযোগ্যতার" উদাহরণের সাথে সম্পূর্ণ একমত নয়। আপনি যদি মাল্টি-লাইনের জন্য যাচ্ছেন তবে কেন কেবল একটি বিবৃতি ব্যবহার করবেন না?
জো ফিলিপস

3
কেবল কারণ যদি অন্য কোনও সাধারণ সিদ্ধান্তের জন্য আরও বেশিরভাগ শব্দ: int a = 0; if (b> 10) a = some_value; অন্য ক = অন্য_মূল্য; তুমি কোনটা বেশি পছন্দ কর?
মার্কোস্পেরির

44
@ d03boy: কারণ যদি-বিবৃতি ঠিক তেমন হয় তবে একটি বিবৃতি, এবং যখন আপনি চান তখন সমস্ত একটি এক্সপ্রেশন হয় না।
ফালস্ট্রো

2
@ কিছু ভাষাগুলিতে প্রকাশ যদি অভিব্যক্তি হয় (উদাহরণস্বরূপ স্কালায়) তবে val x = if(true) 0 else 1এটি পুরোপুরি আইনী
ওম-নাম-মনোনীত

5
@ ওম-নম-নমুন কেস পয়েন্টে, এটি যদি একটি ইফ-এক্সপ্রেশন তৈরি করে, তবে এটি যদি একটি বিবৃতি না দেয় এবং মূলত:? অপারেটর হিসাবে একই জিনিস হয়?
ফলস্ট্রো

140

এটি ডিবাগিংকে কিছুটা আরও কঠিন করে তোলে যেহেতু আপনি প্রতিটি সাব এক্সপ্রেশনটিতে ব্রেকপয়েন্ট রাখতে পারবেন না। আমি এটি খুব কমই ব্যবহার করি।


44
এটি আমি শুনেছি এমন টার্নারি অপারেটরের বিরুদ্ধে সেরা যুক্তি। আমি "পঠনযোগ্য নয়" যুক্তিটি কিনছি না (এটি আমার কাছে শোনার মতো লোকেরা খুব অলস বলে মনে হয়) তবে এটিতে আসলে পদার্থ রয়েছে।
অ্যাপসিলনভেক্টর

80

আমি তাদের ভালবাসি, বিশেষত টাইপ-নিরাপদ ভাষায়।

আমি এটি দেখতে পাচ্ছি না:

int count = (condition) ? 1 : 0;

এর চেয়ে শক্ত কোনটি:

int count;

if (condition)
{
  count = 1;
} 
else
{
  count = 0;
}

সম্পাদনা -

আমি যুক্তি দিয়েছি যে টার্নারি অপারেটররা বিকল্পের চেয়ে সবকিছুকে কম জটিল এবং আরও ঝরঝরে করে তোলে।


5
যখন ভেরিয়েবল স্থির থাকে তখন টার্নারি ইনিশিয়ালাইজেশন ডি বা সি ++ তে আরও বেশি কার্যকর। যেমন const int count = ...;
deft_code

ঠিক আছে, আপনি if/elseসেখানে বিনাবিহীন ধনুর্বন্ধনী দিয়ে একধরণের ভুল উপস্থাপনা করছেন ।
bobobobo

1
এছাড়াও, এই ক্ষেত্রে যদি conditionহয় bool আপনি শুধু করতে পারে int count = condition;
bobobobo

1
@ বোকোবাক্সটি if/elseধনুর্বন্ধনী সহ এটি কীভাবে প্রোগ্রামারদের সংখ্যাগরিষ্ঠ অংশটি তিনটি পুনর্লিখন করবেন ..
আন্দ্রে ফিগুয়েরেদো

1
@ বোবোবোবু যদি / অন্য ডাব্লু / ও ব্রেসগুলি কেবল সমস্যার জন্য জিজ্ঞাসা করে। কারও পক্ষে একটি লাইন যুক্ত করা খুব সহজ, তবে ভুলে যান যে তার পরে তাদের প্রত্যাশা অনুযায়ী করণীয়গুলির প্রয়োজন হবে (একটি ব্লকের অংশ হিসাবে অতিরিক্ত লাইনটি কার্যকর করুন): stackoverflow.com/a/381274/377225
জর্জ মারিয়ান

43

শৃঙ্খলিত আমি ঠিক আছি - খুব বেশি কিছু নেই।

আমি এগুলিকে সি-তে আরও বেশি ব্যবহার করার প্রবণতা রাখি কেবলমাত্র খ / সি তারা একটি বিবৃতি যার মান রয়েছে, সুতরাং এটি অপ্রয়োজনীয় পুনরাবৃত্তি বা ভেরিয়েবলকে হ্রাস করে:

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

বরং

     if (y < 100) { x = "dog"; } 
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; } 
else              { x = "baz"; }

এর মতো অ্যাসাইনমেন্টগুলিতে, আমি এটি রিফ্যাক্টর কম এবং পরিষ্কার হিসাবে কম।

আমি যখন অন্যদিকে রুবিতে কাজ করছি তখন আমার ব্যবহারের সম্ভাবনা বেশি if...else...endকারণ এটিও একটি অভিব্যক্তি।

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(যদিও, স্বীকারোক্তিজনক, এই সাধারণ কোনও কিছুর জন্য, আমি কেবল যাইহোক টেরিনারি অপারেটরটি ব্যবহার করতে পারি)।


2
আমি আপনার প্রথম উদাহরণটি পছন্দ করি - আমি তাদের আগে এইরকম শৃঙ্খলিত করার কথা ভাবিনি। ভাগ করে নেওয়ার জন্য ধন্যবাদ. =)
এরিক ফোর্বস

5
+1 আমি সম্প্রতি এটি করা শুরু করেছি। আমি আসলে এমনকি এটি সুইচ স্টেটমেন্ট প্রতিস্থাপন করতে।
ডেভি

1
@ উদাহরণস্বরূপ দুর্দান্ত উদাহরণ।
ইলিউমিনেট করুন

39

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

তবে প্রচুর পরিস্থিতি রয়েছে যেখানে ?:অপারেটরের রক্ষণশীল ব্যবহারের ফলে কোডটি পাওয়া যেতে পারে যা অন্যথায় তুলনায় আসলে পড়া সহজ । উদাহরণ স্বরূপ:

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;              
}

এখন এটির সাথে এটি তুলনা করুন:

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;         
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else        
       return 0;              
}

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


আমি এখনও যদি প্রতিটি / তারপরে / তৃতীয় নয় এমন নির্মাণের প্রতি প্রশংসা ব্যবহার করার পক্ষে পরামর্শ দেব, সুতরাং আপনার দ্বিতীয় উদাহরণটি কয়েকটি ইমো অনুপস্থিত।
ক্রিস

হ্যাঁ, এটি কার্যকরী। এটি একটি ক্ষুদ্র ফাংশনের মতো যার একটি একক বুলিয়ান যুক্তি রয়েছে এবং আপনি যে কোনও প্রকারের ফেরত চান! আসলে একটি ঝরঝরে অপারেটর।
bobobobo

24

এটি স্টাইলের প্রশ্ন, সত্যই; অবচেতন নিয়মগুলি আমি অনুসরণ করি are

  • কেবল 1 টি এক্সপ্রেশনকে মূল্যায়ন করুন - তাই foo = (bar > baz) ? true : false, তবে তা নয়foo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
  • যদি আমি এটি ডিসপ্লে লজিকের জন্য ব্যবহার করি, যেমন <%= (foo) ? "Yes" : "No" %>
  • কেবলমাত্র এটি নিয়োগের জন্য ব্যবহার করুন; প্রবাহ কখনও যুক্তিযুক্ত (তাই না (foo) ? FooIsTrue(foo) : FooIsALie(foo)) টেরিনারি প্রবাহ যুক্তি নিজেই একটি মিথ্যা, যে শেষ পয়েন্ট উপেক্ষা।

আমি এটি পছন্দ করি কারণ এটি সহজ অ্যাসাইনমেন্ট ক্রিয়াকলাপের জন্য সংক্ষিপ্ত এবং মার্জিত।


ভাল গাইডলাইন এবং চমৎকার উদাহরণ!
নিকফ 23

আমি মনে করি বেশিরভাগ ল্যাঙ্গেজগুলি আপনাকে প্রবাহ যুক্তির জন্য এটি ব্যবহার করতে দেয় না, সুতরাং আপনি (foo) করতে পারবেন না? সত্য (foo): মিথ্যা (foo); যদি না এটি একটি অ্যাসাইনমেন্ট ছিল।
হেনরি বি

উফ, হ্যাঁ আপনি ঠিক বলেছেন, আমার খারাপ।
কিথ উইলিয়ামস 14

21
আপনার দুটি প্রথম উদাহরণ সত্যই খারাপ। তুলনার ফলাফলগুলি ইতিমধ্যে বুলিয়ান মান রয়েছে, সুতরাং আপনার টর্নারি অপারেটরগুলি অকেজো এবং কেবল কোডকে জটিল করে তুলবে।
ট্রিলিয়ান

1
@ ট্রিলিয়ান +1 হ্যাঁ, অন্য একটি অ্যাসাইনমেন্ট নিয়ে যাওয়া উচিত ছিল। foo = (bar > baz);অনেক সহজ
এরিক

18

অনেক মতামত প্রশ্ন মত, উত্তর অনিবার্য: এটি নির্ভর করে

যেমন কিছু জন্য:

return x ? "Yes" : "No";

আমি মনে করি এটি তুলনায় অনেক সংক্ষিপ্ত (এবং পার্স করার জন্য আমার পক্ষে দ্রুত):

if (x) {
    return "Yes";
} else {
    return "No";
}

এখন যদি আপনার শর্তসাপেক্ষ প্রকাশটি জটিল হয় তবে ত্রৈমাসিক ক্রিয়াকলাপটি ভাল পছন্দ নয়। কিছুটা এইরকম:

x && y && z >= 10 && s.Length == 0 || !foo

টার্নারি অপারেটরের পক্ষে ভাল প্রার্থী নয়।

একদিকে যেমন, আপনি যদি একজন সি প্রোগ্রামার হন তবে জিসিসির আসলে একটি এক্সটেনশন রয়েছে যা আপনাকে এই জাতীয় বার্নের সত্যিকারের অংশটি বাদ দিতে দেয়:

/* 'y' is a char * */
const char *x = y ? : "Not set";

কোনটি সেট হবে xথেকে yঅভিমানী yনয় NULL। ভাল জিনিস.


সামান্য সিনট্যাক্স এবং ব্যাকরণ প্রোব সংশোধন করা হয়েছে, শন :-) কোডের শেষ বিট থেকে y অনুপস্থিত এবং "অ্যাসাইন এক্স থেকে y" এর অর্থ "y = x", তাই আমি chgd "সেট x থেকে y" করতে চাই।
paxdiablo

@ প্যাক্স: ধন্যবাদ! আমি সিনট্যাক্স পরিবর্তনটি ফিরিয়ে নিয়েছি যেহেতু আমি এটি উল্লেখ করার চেষ্টা করছিলাম যে জিসিসি এক্সটেনশনগুলির সাথে আপনার তিনটি অংশের সত্য-সত্য অংশের দরকার নেই।
শান ব্রাইট

দুঃখিত, অনুচ্ছেদটি দেখেনি। জানেন না যে আমি এই ধরণের স্টাফের সাথে একমত, যদিও এটি লোককে এমন কোনও কোড লিখতে দেয় যা কোনও আইএসও-স্ট্যান্ডার্ড সংকলক দিয়ে সংকলন করে না। তবুও, যখন জিসিসি শেষ ব্যক্তি দাঁড়িয়ে আছেন, তাতে কিছু যায় আসে না :-)
প্যাক্সিডিয়াব্লো

এটি অবশ্যই ভুডু, ... এবং কে জিসিসি ব্যবহার করে না? : ডি
শান ব্রাইট

14

আমার মনে, কেবলমাত্র যে ক্ষেত্রে অভিব্যক্তি প্রয়োজন সেখানে টের্নারি অপারেটরটি ব্যবহার করা বোধগম্য।

অন্যান্য ক্ষেত্রে, দেখে মনে হচ্ছে টের্নারি অপারেটর স্পষ্টতা হ্রাস পেয়েছে।


সমস্যাটি যে ভাষার 99%, কোনও ক্রিয়াকলাপ দ্বারা একটি এক্সপ্রেশন প্রতিস্থাপন করা যেতে পারে ... এবং টেরিনারি অপারেটর এড়ানো পিপিএল এমনকি সেই সমাধানটিকে পছন্দ করবে।
পিয়েরবিডিআর

11

সাইক্লোমেটিক জটিলতার পরিমাপের দ্বারা , ifবিবৃতিগুলির ব্যবহার বা টের্নারি অপারেটর সমতুল্য। সুতরাং যে পরিমাপ দ্বারা, উত্তর না , জটিলতা ঠিক ঠিক আগের মত হবে।

পাঠযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা এবং ডিআরওয়াই (ডোন্ট-রিপিট-নিজেই) এর মতো অন্যান্য পদক্ষেপের দ্বারা, যে কোনও একটি পছন্দ অন্যটির চেয়ে ভাল প্রমাণিত হতে পারে।


10

আমি এটি বেশিরভাগ জায়গায় যেখানে কনস্ট্রাক্টরে কাজ করতে বাধ্য হই - যেখানে উদাহরণস্বরূপ, এক্সপ্লোরের নতুন এক্সপ্লোর পরিচালনা লিঙ্ক থেকে এক্সপ্লোর পরিচালনা লিনক - যখন optionচ্ছিক প্যারামিটারটি বাতিল হয় তখন ডিফল্ট মানগুলি সংজ্ঞায়িত করতে হয়।

অনুমোদিত উদাহরণ:

var e = new XElement("Something",
    param == null ? new XElement("Value", "Default")
                  : new XElement("Value", param.ToString())
);

বা (ধন্যবাদ গ্রহাণু)

var e = new XElement("Something",
    new XElement("Value",
        param == null ? "Default"
                      : param.ToString()
    )
);

আপনি টার্নারি অপারেটরটি ব্যবহার করেন বা না করেন তা নয়, আপনার কোডটি পাঠযোগ্য কিনা তা নিশ্চিত করা গুরুত্বপূর্ণ বিষয় thing যে কোনও নির্মাণকে অপঠনযোগ্য করে তোলা যায়।


বা ... var ই = নতুন এক্সিলিমেট ("কিছু কিছু", নতুন এক্সএলেমেন্ট ("মান", পরম == নাল? "ডিফল্ট": প্যারাম.টোস্ট্রিং ());
গ্রহাণু

2
আমি পছন্দ করি আপনি এটি পাঠযোগ্যতার জন্য ফর্ম্যাট করছেন, তাই অনেকেই করেন না।
ব্রুস্যাটাক

মানব পাঠযোগ্য উত্স কোড যদি এটি মানব পাঠযোগ্য না হয় তবে কী ভাল? =)
এরিক ফোর্বস

9

আমি যেখানেই পারি সেখানে টার্নারি অপারেটরটি ব্যবহার করি, যদি না এটি কোড পড়তে চূড়ান্ত করে তোলে তবে তারপরে এটি কেবলমাত্র একটি ইঙ্গিত যে আমার কোডটি কিছুটা রিফ্যাক্টরিং ব্যবহার করতে পারে।

এটি সর্বদা আমাকে ধাঁধা দেয় যে কিছু লোক কীভাবে মনে করেন যে টের্নারি অপারেটরটি "লুকানো" বৈশিষ্ট্য বা কিছুটা রহস্যজনক। আমি যখন সি তে প্রোগ্রামিং শুরু করি তখন এটি প্রথম জিনিসগুলির মধ্যে একটি, এবং আমি মনে করি না এটি পড়ার সামর্থ্য হ্রাস করে না। এটি ভাষার একটি প্রাকৃতিক অঙ্গ।


1
আমি পুরোপুরি একমত এটি সম্পর্কে গোপন বা কৌশলযুক্ত কিছুই নেই।
এমএমটিট্যাক্স

2
এটি পাঠযোগ্যতার সমস্যাগুলি সৃষ্টি করতে পারে, বিশেষত যখন নেস্টেড।
ডেভিড থর্নলি

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

8

(দিনের হ্যাক)

#define IF(x) x ?
#define ELSE :

তারপরে আপনি যদি-তবে-অন্যথায় প্রকাশ হিসাবে করতে পারেন:

int b = IF(condition1)    res1
        ELSE IF(condition2)  res2
        ELSE IF(conditions3) res3
        ELSE res4;

7

আমি জামুল্ডারের সাথে একমত: এটি কোনওটির জায়গায় ব্যবহার করা উচিত নয় if, তবে এটির প্রত্যাবর্তনের অভিব্যক্তির জন্য বা একটি অভিব্যক্তির অভ্যন্তরে এটি রয়েছে:

echo "Result: " + n + " meter" + (n != 1 ? "s" : "");
return a == null ? "null" : a;

পূর্ববর্তীটি একটি উদাহরণ, বহুবচনের আরও ভাল আই 18 এন সমর্থন ব্যবহার করা উচিত!


প্রথম ত্রৈমাসিকটি ভুল - আপনি একটি পেয়েছেন: কোথায়? যাওয়া উচিত: (এন! = 1 ? "এস": "")
এরিক ফোর্বস

হ্যাঁ, এটি নির্দেশ করার জন্য ধন্যবাদ! সংশোধন করা হয়েছে।
ফিলোহো

6

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


5

আমি মনে করি প্রয়োজনের সময় টার্নারি অপারেটরটি ব্যবহার করা উচিত। এটি অবশ্যই খুব সাবজেক্টিভ পছন্দ, তবে আমি দেখতে পেলাম যে একটি সাধারণ অভিব্যক্তি (বিশেষত একটি রিটার্ন এক্সপ্রেশন হিসাবে) সম্পূর্ণ পরীক্ষার চেয়ে অনেক পরিষ্কার। সি / সি ++ এর উদাহরণ:

return (a>0)?a:0;

তুলনা করা:

if(a>0) return a;
else return 0;

আপনার ক্ষেত্রেও সমাধান রয়েছে যেখানে সমাধানটি টার্নারি অপারেটর এবং একটি ফাংশন তৈরির মধ্যে রয়েছে। পাইথনে উদাহরণস্বরূপ:

l = [ i if i > 0 else 0 for i in lst ]

বিকল্পটি হ'ল:

def cap(value):
    if value > 0:
        return value
    return 0
l = [ cap(i) for i in lst ]

পাইথনের (উদাহরণ হিসাবে), এ জাতীয় প্রতিবাদটি নিয়মিত দেখা যেত: এটি পর্যাপ্ত প্রয়োজন:

l = [ ((i>0 and [i]) or [0])[0] for i in lst ]

এই লাইনটি পাইথনের লজিকাল অপারেটরগুলির বৈশিষ্ট্যগুলি ব্যবহার করে: তারা অলস এবং চূড়ান্ত অবস্থার সমান হলে শেষ মান গণনা করে।


3
সেই শেষ লাইনটি আমার মস্তিষ্ককে ব্যাথা দেয় ...
এরিক ফোর্বস

5

আমি তাদের পছন্দ করি আমি জানি না কেন, তবে আমি যখন তিনটি অভিব্যক্তিটি ব্যবহার করি তখন আমি খুব শীতল বোধ করি।


5

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

isLeapYear =
    ((yyyy % 400) == 0)
    ? 1
    : ((yyyy % 100) == 0)
        ? 0
        : ((yyyy % 4) == 0)
            ? 1
            : 0;

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

ছোট ছোট বিষয়গুলির জন্য আমি এতে আপত্তি করি না:

reportedAge = (isFemale && (Age >= 21)) ? 21 + (Age - 21) / 3 : Age;

এমনকি কিছুটা কৃপণ জিনিস যেমন:

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");

বিবৃতি আরও পঠনযোগ্য হলে আপনি কীভাবে বিচ্ছিন্নতার ধারাবাহিকতা বলতে পারেন? আমি আপনার "জন্তু" ঠিকঠাক পড়েছি । reportedAgeকিছু উদাহরণস্বরূপ লাগে এমন উদাহরণ - সম্ভবত কারণ এটি নির্ধারণের চেয়ে কোনও নির্দিষ্ট ক্ষেত্রে বেশিisThisYearALeapYear
অক্সিমান

4

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

আমি এটিকে আরও পঠনযোগ্য করে তোলার জন্য ম্যাক্রো তৈরি করার পরামর্শ দেব, তবে আমি নিশ্চিত যে কেউ ভয়ঙ্কর প্রান্তের মামলাটি নিয়ে আসতে পারে (যেমন সর্বদা সিপিপির সাথে থাকে)।


অনেক বেসিক বাস্তবায়ন এবং রূপগুলির একটি আইএফ ফাংশন থাকে যা টের্নারি অপারেটরের স্থান নেয়। সি তে ম্যাক্রো হিসাবে সংজ্ঞায়িত হওয়া বেশ কয়েকটি কোডবেস আমি দেখেছি
স্পার

ঠিক আছে, আমি ক্রিয়ামূলক প্রোগ্রামিং ভাষার কথা ভাবছিলাম, তবে হ্যাঁ।
মার্সিন

"এটিকে আরও পঠনযোগ্য করে তোলার জন্য ম্যাক্রো তৈরি করা," আপনি বেশ জোকার!
নিক্সর

4

আমি ত্রুটি মানগুলি মুদ্রণ করতে ডিবাগ কোডে অপারেটরটি ব্যবহার করতে পছন্দ করি যাতে আমাকে সমস্ত সময় সন্ধান করতে হবে না। সাধারণত আমি এটি ডেবগ প্রিন্টগুলির জন্য করি যা একবার আমার বিকাশ শেষ হয়ে গেলে আর যায় না।

int result = do_something();
if( result != 0 )
{
  debug_printf("Error while doing something, code %x (%s)\n", result,
                result == 7 ? "ERROR_YES" :
                result == 8 ? "ERROR_NO" :
                result == 9 ? "ERROR_FILE_NOT_FOUND" :
                "Unknown");
}


4

আমি প্রায় কখনই টার্নারি অপারেটরটি ব্যবহার করি না কারণ যখনই আমি এটি ব্যবহার করি না, এটি বজায় রাখার চেষ্টা করার পরে পরে যখন যা করা হয় তার চেয়ে সবসময় আমাকে আরও অনেক বেশি ভাবতে বাধ্য করে।

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

বিবেচনা:

String name = firstName;

if (middleName != null) {
    name += " " + middleName;
}

name += " " + lastName;

এখন, এটি কিছুটা ভার্বোজ, তবে আমি এটির চেয়ে অনেক বেশি পঠনযোগ্য বলে মনে করি:

String name = firstName + (middleName == null ? "" : " " + middleName)
    + " " + lastName;

বা:

String name = firstName;
name += (middleName == null ? "" : " " + middleName);
name += " " + lastName;

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


1
যদিও এটি ঠিক একই জিনিস নয়। দ্বিতীয় উদাহরণে আপনি তিনটি বিবৃতি এক লাইনে সংক্ষেপিত করছেন। এটিই পাঠ্যতা হ্রাস করে, টের্নারি অপারেটর নয়।
ইলিটরিট

যথেষ্ট ভাল, আমি আপনার মন্তব্য অন্তর্ভুক্ত করার জন্য আপডেট করেছি, তবে এটি এখনও আমার কাছে বিশৃঙ্খলা বোধ করে ... তবে আবার এটি বিষয়বস্তু ... আমি বলছি না ত্রৈমাসিক পাঠযোগ্য নয়, আমি বলছি এটি আমার কাছে পাঠযোগ্য নয় (99) সময়ের%)
মাইক স্টোন


3

আমি সাধারণত এই জাতীয় জিনিসগুলিতে ব্যবহার করি:

before:

if(isheader)
    drawtext(x,y,WHITE,string);
else
    drawtext(x,y,BLUE,string);

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);

অবশ্যই বেশিরভাগ ভাষায়, আপনার সেই তিনটি অংশের "== সত্য" অংশের প্রয়োজন হবে না।
মাইকেল হরেন

আমি বুঝতে পেরেছি, যদিও আমি কোডটি আরও পঠনযোগ্য করার জন্য এটিকে রেখেছি যেহেতু
সংকলকটি

মধ্যে কোন ভাষা আপনি সম্ভবত প্রয়োজন করতে পারেন "== প্রকৃত"
niXar

আমি upvote বা না কি সিদ্ধান্ত নিতে কঠিন সময় ছিল। উদাহরণটি দুর্দান্ত তবে == সত্যই এমন একটি জিনিস যা আমি অন্য লোকের কোডে দেখতে পারছি না।
পিটার পেরে

3

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

int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;

আর একটি সাধারণ ব্যবহার হ'ল সি ++ তে একটি রেফারেন্স শুরু করা। যেহেতু একই বিবৃতিতে রেফারেন্সগুলি ঘোষণা করতে হবে এবং শুরু করতে হবে আপনি একটি বিবৃতি ব্যবহার করতে পারবেন না।

SomeType& ref = pInput ? *pInput : somethingElse;

2
আশ্চর্যজনক যে এটি সূচনা সূচনাগুলির প্রথম উল্লেখ, যা কয়েকটি জায়গায় যেখানে "যদি" পরিবর্তে ব্যবহার করা যায় না? "। (আমি অনুমান করি কারণ এটি কোনও সি ++ নয় - নির্দিষ্ট প্রশ্ন ...) একই কারণে তারা কনস্ট্রাক্টর ইনিশিয়েশন তালিকাতেও কার্যকর।
j_random_hacker

2

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


2

আমি সম্প্রতি টার্নারি অপারেটরগুলির মধ্যে একটি ভিন্নতা দেখেছি (ভাল, সাজানো) যা মান "()?:" রূপটিকে স্পষ্টতার এক উপমা বলে মনে হচ্ছে:

var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]

বা, আরও স্পষ্ট উদাহরণ দিতে:

var Name = ['Jane', 'John'][Gender == 'm'];

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


1
বাহ, এটা ভয়ঙ্কর! যারা একসাথে বাসা বাঁধে কল্পনা করুন! কেবলমাত্র অস্পষ্টভাবে দরকারী জিনিসটি আমি তার সাথে দেখতে পাচ্ছি যদি আপনার এমন কোনও ফাংশন থাকে যা একটি 2-উপাদান অ্যারের ফিরিয়ে দেয়: var নাম = getNames () [লিঙ্গ == 'মি']; ... তবে এটি এমনকি কম পাঠযোগ্য!
নিকফ

2

সহজ ক্ষেত্রে যদি আমি এটি ব্যবহার করতে চান। প্রকৃতপক্ষে ফাংশন বা এর মতো জিনিসগুলির জন্য প্যারামিটার হিসাবে উদাহরণস্বরূপ কোড / কোড পড়া খুব সহজ। এছাড়াও নতুন লাইনটি এড়াতে আমি আমার / যদি অন্য কোনওটি দিয়ে রাখতে চাই।

এটির দরকার নেই আমার বইয়ের একটি বড় NO-NO হবে।

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


2

এলভিস অপারেটর নামে পরিচিত টার্নারি অপারেটরের গ্রোভির বিশেষ মামলাটি আমি পছন্দ করি:?:

expr ?: default

এই কোডটি শূন্য না হলে প্রকাশের জন্য মূল্যায়ন করে এবং যদি এটি হয় তবে ডিফল্ট হয়। প্রযুক্তিগতভাবে এটি কোনও টেরিনারি অপারেটর নয়, তবে এটি অবশ্যই এর সাথে সম্পর্কিত এবং অনেক সময় / টাইপিং সাশ্রয় করে।


হ্যাঁ, আমি সেটিকেও খুব পছন্দ করি - এটি ??সি # তে, নাল কোলেস অপারেটর: স্ট্যাকওভারফ্লো
জারোদ ডিকসন

2

সাধারণ কাজের জন্য যেমন তারা দুর্দান্ত সে অবস্থার উপর নির্ভর করে একটি আলাদা মান নির্ধারণ করে। যখন শর্তটির উপর নির্ভর করে দীর্ঘতর অভিব্যক্তি থাকবে তখন আমি সেগুলি ব্যবহার করব না।


2

এতগুলি উত্তর বলেছে, এটি নির্ভর করে । আমি দেখতে পেয়েছি যে যদি কোডটি দ্রুত স্ক্যান করার জন্য ত্রৈমাসিক তুলনাটি দৃশ্যমান না হয়, তবে এটি ব্যবহার করা উচিত নয়।

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

x[if y > 5 then 5 else y] := "Y" 

... যা আমি টর্নারি তুলনা অপারেটরের চেয়ে অনেক বেশি পঠনযোগ্য বলে মনে করি। :-)

?:আইকনটিতে অপারেটর যুক্ত করার সম্ভাবনা সম্পর্কে সম্প্রতি একটি আলোচনা হয়েছিল , তবে বেশিরভাগ লোক সঠিকভাবে উল্লেখ করেছিলেন যে উপায়টি ifকাজ করার কারণে একেবারেই প্রয়োজন নেই ।

যার অর্থ হ'ল আপনি যদি সিতে (বা অন্য কোনও ভাষাতে টের্নি অপারেটর থাকতে পারে) করতে পারতেন তবে বাস্তবে আপনার টর্নি অপারেটরের প্রয়োজন হবে না।


2

আপনি এবং আপনার সহকর্মীরা যদি তারা বুঝতে পারেন যে তারা কী করে এবং তারা বৃহত্তর গ্রুপগুলিতে তৈরি না হয় তবে আমি মনে করি তারা কোড কম জটিল এবং সহজেই পড়তে সহজ করেছেন কারণ কেবলমাত্র কম কোড রয়েছে।

আমার মনে হয় কেবলমাত্র যখন তিনটি অপারেটররা কোডটি বোঝার জন্য আরও কঠিন করে তোলে তখন আপনার যখন এক লাইনে 3 বা 4 এর বেশি থাকে। বেশিরভাগ লোক মনে রাখে না যে তারা সঠিক ভিত্তিক অগ্রাধিকার এবং যখন আপনার একটি স্ট্যাক থাকে তখন কোডটি পড়া একটি দুঃস্বপ্ন।

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