টার্নারি অপারেটরকে ক্ষতিকারক বলে মনে করছেন? [বন্ধ]


79

উদাহরণস্বরূপ, আপনি এই ওয়ান-লাইনার পছন্দ করেন?

int median(int a, int b, int c) {
    return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b;
}

বা একটি / যদি একাধিক রিটার্ন বিবৃতি জড়িত সমাধান?

কখন ?:উপযুক্ত, এবং কখন নয়? এটি শিখানো উচিত বা প্রাথমিক থেকে গোপন করা উচিত?


221
এটির এই বিশেষ ব্যবহারটি হ'ল :)
কর্মজুঙ্কি

6
কে এটিকে কোড করেছে এবং চারটি সংখ্যার জন্য তাদের মধ্যম সংস্করণটি কেমন দেখাচ্ছে? নাকি পাঁচ?
ম্যাসন হুইলারের

3
আরও সঠিক নাম হ'ল 'শর্তসাপেক্ষ অপারেটর'। এটি কেবলমাত্র ব্যবহৃত সবচেয়ে সাধারণ টের্নারি অপারেটর হিসাবে ঘটে।
অ্যালান পিয়ার্স

1
এটি স্ট্যাকওভারফ্লোতে দুই বছর আগে জিজ্ঞাসা করা হয়েছিল। আমরা কি এখন এখানে সবকিছু আবার জিজ্ঞাসা করতে যাচ্ছি? stackoverflow.com/questions/160218/to-ternary-or-not-to-ternary
webbiedave

3
আমি অবাক হয়েছি কেন এই জাতীয় প্রশ্ন আসতে থাকে? উত্তরটি সর্বদা "যা কাজ করে এবং পাঠযোগ্য is" - শেষটি সমান গুরুত্বপূর্ণ।
অপুরভ খুরসিয়া

উত্তর:


234

টেরিনারি অপারেটর কি মন্দ?

না এটা আশীর্বাদ।

কখন?: উপযুক্ত?

এটি এত সহজ কিছু যখন আপনি এর জন্য অনেকগুলি লাইন নষ্ট করতে চান না।

এবং কখন না?

কোডের পঠনযোগ্যতা এবং স্পষ্টতা যখন ভুগছে এবং অপর্যাপ্ত মনোযোগের মাধ্যমে একটি ভুলের সম্ভাবনা বৃদ্ধি পায়, উদাহরণস্বরূপ, অনেক শৃঙ্খলিত অপারেটর যেমন আপনার উদাহরণের মতো।


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


23
+1 এর জন্য যখন কোডের পাঠযোগ্যতা এবং স্পষ্টতা ভোগে। অনেক চেইন অপারেটর সহ, যেমন আপনার উদাহরণের মতো। উদাহরণটি যদি / অন্যটির হয় তবে তার তুলনায় সমান হতে বেশি সময় নেয়।
sange

23
দুর্দান্ত ব্যাখ্যার জন্য +1 ব্রাভো! বিকাশকারীরা বুঝতে পারেন না যে কিছু জিনিস রায় কল হয়, তারা চায় যে সবকিছু কালো এবং সাদা হোক। এটা আমার বাদাম চালায়। "এক্স দুষ্ট, এটি কখনও ব্যবহার করতে দেয় না" মতামতের অনেক লোকের সাথে আমি মুখোমুখি হয়েছি। আমি পছন্দ করি "এক্স যদি দুর্দান্ত হয় তবে এটির জন্য আপনি যদি এটি ব্যবহার করেন"।
ডক্টর জোন্স

54
এটি ব্যবহার করা খারাপও : মাইভার = (কিছুটা এক্সপ্রেশন)? সত্য মিথ্যা; Aaaaarrgh!
adamk

20
@ অ্যাডামক: অনিষ্টের জন্য এটি চেষ্টা করুন:myVar = someExpression ? false : true;
ডিন হার্ডিং

8
সম্পর্কে (someExpression ? var1 : var2)++:-)
ফ্রেডওভারফ্লো

50

আমি মনে করি নিরীক্ষিত টার্নারি অপারেটর (অর্থাত্ একটি বিবৃতি যেখানে এটি একবার ব্যবহার করা হয়েছে) ঠিক আছে তবে আপনি যদি একের বেশি বাসা বাঁধেন তবে এটি পড়া কিছুটা শক্ত হয়ে যায়।


3
এটি একটি ওভারসিম্প্লিফিকেশন হিসাবে বিবেচিত হতে পারে তবে এটি অনুসরণ করা খুব সহজ গাইডলাইন এবং এটি বেশিরভাগ ক্ষেত্রেই কার্যকর হয়।
অ্যালান পিয়ার্স

2
এটি আসলে আমার থাম্বের নিয়ম: আপনার কখনই বাসা বাঁধতে হবে না, অন্যথায় যদি তাদের সাথে প্রতিস্থাপন করে তবে / অন্যথায়, এটি সেভাবে আরও পরিষ্কার হবে।
পাইভজান

যদি আপনি এগুলি ব্যবহার করেন এবং সেগুলি বাসা বেঁধে রাখেন তবে মানবতার ভালবাসার জন্য এটি পাঠযোগ্য করে তোলার জন্য প্রথম বন্ধনী এবং সাদা স্থান ব্যবহার করুন। অন্যথায় যদি ঠিক তেমন কুৎসিত তৈরি করা যায়। সংকলকরা পড়তে পারে তবে মানুষ পারে না এমন কিছু লিখে আপনি কীভাবে 'স্মার্ট' তা দেখানোর তাগিদকে প্রতিহত করুন। কোনও দিন আপনি এমন মানুষ হবেন যা পারবেন না।
candied_orange

24

কখন?: উপযুক্ত

  • যখন এটি আপনার কোডটিকে আরও সংক্ষিপ্ত এবং পাঠযোগ্য করে তুলবে।

এবং কখন না?

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

আপনার যদি ত্রৈমাসিক ভাবের ভিতরে কোনও যুক্তি বা ফাংশন কল থাকে তবে আপনি এটি দেখতে ভয়ঙ্কর করে তুলছেন।


এই এক অনেক উপার্জনের দাবি!
পাইভজান

22

একটি পার্থক্য যা (আমি মনে করি) কেউই উল্লেখ করেছে যে তা যদি-অন্যথায় কোনও মান ফেরত দিতে না পারে, তবে টের্নারি অপারেটর পারে।

এফ # থেকে আগত, আমি মাঝে মাঝে প্যাটার্ন মিলের নকল করতে টের্নারি অপারেটরটি ব্যবহার করতে চাই।

match val with
| A -> 1
| B -> 3
| _ -> 0

বনাম

return val == A ? 1 : 
       val == B ? 3 : 
       0;

যে বেশ শান্ত. কখনও ভেবে দেখিনি।
রেই মিয়াসাকা

+1 @ বেঞ্জল: আমি একই জিনিসটি উল্লেখ করতে যাচ্ছি (এফ # এ, / এলিফ / অন্যটি সহ সমস্ত কিছুই একটি অভিব্যক্তি)। আমি আপনার উদাহরণের মতো টেরিনারিগুলিও ব্যবহার করি, এখনও অবধি অনাবৃত :)। জাভাস্ক্রিপ্টে সম্ভবত আমি উপরের দিকে আরেকটি জিনিস করছি, এটি হল: var res = function() {switch(input) {case 1: return "1"; case 2: return "2"; ...}}()সুইচগুলি এক্সপ্রেশন হিসাবে অনুকরণ করা।
স্টিফেন সোয়েনসেন

@ স্টিফেন, আমি এই শব্দগুলি ব্যবহার করতে যাচ্ছিলাম expressionএবং statementতবে আমি সর্বদা উদ্বিগ্ন যে আমি তাদের ভুল উপায়ে নিয়ে যাব এবং নিজেকে বোকা
বানিয়ে

@ বেঞ্জল: আমি জানি আপনি কী বোঝাতে চেয়েছেন!
স্টিফেন সুইসেনেন

6
constভেরিয়েবলগুলি আরম্ভ করার জন্য সি এবং সি ++ তেও কার্যকর যা পরে পরিবর্তন করা যায় না।
ডেভিড থর্নলি

13

বৈধ ব্যবহারের একটি উদাহরণ (আইএমএইচও):

printf("Success in %d %s\n", nr_of_tries, (nr_of_tries == 1 ? "try" : "tries"));

এটি 2 স্বতন্ত্র মুদ্রণ বিবৃতি চেয়ে বেশি পঠনযোগ্য কোডে ফলাফল। নেস্টেড উদাহরণ নির্ভর করে: (বোধগম্য? হ্যাঁ: না)


11
কেবল মনে রাখবেন যে আপনি যদি এটি করেন তবে আপনার অ্যাপ্লিকেশনটি যাকে স্থানীয় করতে হবে তার জন্য আপনি এটিকে নরক করছেন। অবশ্যই, যদি এটি কোনও সমস্যা না হয় তবে ঠিক এগিয়ে যান।
আনন

1
এটাই আমার নিয়মের নিয়ম: নীড় বাঁধার 1 স্তর (কিছু পরিস্থিতিতে)।
অলিভার ওয়েইল

7

একেবারে মন্দ নয়। আসলে, এটি খাঁটি , এবং যদি-তবে-অন্যথায় হয় না।

হাস্কেল, এফ #, এমএল ইত্যাদির মতো ক্রিয়ামূলক ভাষায়, এটি যদি অন্যথায় বিবৃতি হয় তবে এটি মন্দ বলে বিবেচিত হয়।

এর কারণ হ'ল অপরিহার্য মতো কোনও "ক্রিয়া" যদি অন্যথায় বিবৃতি দেয় তবে আপনাকে তার সংজ্ঞা থেকে একটি পরিবর্তনশীল ঘোষণা পৃথক করতে হবে এবং আপনার ফাংশনটির সাথে রাষ্ট্রের পরিচয় দিন ।

উদাহরণস্বরূপ, নিম্নলিখিত কোডে:

const var x = n % 3 == 1
    ? Parity.Even
    : Parity.Odd;

বনাম

Parity x;
if (n % 3 == 1)
    x = Parity.Even;
else
    x = Parity.Odd;

খাটো হওয়া বাদ দিয়ে প্রথমটির দুটি সুবিধা রয়েছে:

  1. x একটি ধ্রুবক এবং তাই বাগগুলি প্রবর্তন করার খুব কম সুযোগ সরবরাহ করা হয় এবং দ্বিতীয়টি কখনই হতে পারে না এমন উপায়গুলিতে সম্ভাব্যভাবে অনুকূলিত হতে পারে।
  2. প্রকারটি প্রকাশের মাধ্যমে স্পষ্ট করে দেওয়া হয়েছে, তাই সংকলক অনায়াসে অনুমান xকরতে পারে যা টাইপ হওয়া দরকার Parity

বিভ্রান্তিকরভাবে, কার্যকরী ভাষায়, টের্নারি অপারেটরকে প্রায়শই যদি-তবে-বলা হয়। হাস্কেলের মধ্যে, আপনি বলতে পারেন x = if n mod 3 == 1 then Odd else Even


হ্যাঁ, এটি বিন্যাসটিও তৈরি হয়েছে বেঞ্জলও। জাভাস্ক্রিপ্টে অভিব্যক্তি হিসাবে স্যুইচ বিবৃতি অনুকরণ করার একটি মজাদার উপায়ের জন্য তার উত্তরটিতে আমার মন্তব্য দেখুন।
স্টিফেন সোয়েনসেন

7

এই নির্দিষ্ট অভিব্যক্তিটি আমার চোখকে আঘাত করে; আমি আমার টিমের এমন কোনও বিকাশকারীকে ধাক্কা মেরে ফেলেছি যা এটি ব্যবহার করেছিল কারণ এটি অকল্পনীয়।

টর্নারি অপারেটরগুলি ভালভাবে ব্যবহার করার সময় মন্দ হয় না। এমনকি তাদের একক লাইন হতে হবে না; একটি দীর্ঘ যা ভাল ফর্ম্যাট করা হয়েছে তা খুব পরিষ্কার এবং সহজেই বোঝা যায়:

return
      ( 'a' == $s ) ? 1
    : ( 'b' == $s ) ? 2
    : ( 'c' == $s ) ? 3
    :                 4;

আমি যদি তারপরে / তারপরে / অন্য শৃঙ্খলার চেয়ে আরও ভাল পছন্দ করি:

if ( 'a' == $s ) {
    $retval = 1;
}
elsif ( 'b' == $s ) {
    $retval = 2;
}
elsif ( 'c' == $s ) {
    $retval = 3;
}
else {
    $retval = 4;
}

return $retval;

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

if    ( 'a' == $s ) { $retval = 1; }
elsif ( 'b' == $s ) { $retval = 2; }
elsif ( 'c' == $s ) { $retval = 3; }
else                { $retval = 4; }

return $retval;

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


আমি কেন মন্তব্যে লাইনব্রেক রাখতে পারি না? Arrgghh!
ক্রিস্টোফার মাহান

3

ভিএস.এনইটি -র রিশার্পার কখনও কখনও অপারেটরের if...elseসাথে প্রতিস্থাপনের পরামর্শ দেয় ?:

মনে হচ্ছে ReSharper দাড়ায় যে শুধুমাত্র যদি অবস্থার / ব্লক একটি নির্দিষ্ট জটিলতা স্তর থেকে কম হয়, অন্যথায় এটা দিয়ে লাঠি if...else


4
রিশার্পার সম্পর্কে আমি পছন্দ করি এমন আরও একটি দুর্দান্ত বৈশিষ্ট্য
টাইপ

2

এটি / অন্য সংমিশ্রণের মতো দেখতে সুন্দর দেখাচ্ছে হিসাবে পুনরায় ফর্ম্যাট করা যেতে পারে:

int median(int a, int b, int c)
{
    return
        (a<b)
        ?
            (b<c)
            ? b
            :
                (a<c)
                ? c
                : a
        :
            (a<c)
            ? a
            :
                (b<c)
                ? c
                : b;
}

তবে সমস্যাটি হ'ল আমি সত্যই নিশ্চিত নই যে আমি প্রকৃতপক্ষে কী ঘটবে তা উপস্থাপন করার অধিকারটি পেয়েছি কিনা। :-)


3
+1 আমি মনে করি এটি সমতুল্য if-elseকাঠামোর চেয়ে অনেক ভাল । মূলটি হ'ল বিন্যাসকরণ।
অরব্লিং

13
যদি আমি এটি কোনও কোড বেসে দেখে থাকি তবে আমি নতুন চাকরির সন্ধানের জন্য গুরুত্ব সহকারে বিবেচনা করব।
নিক লারসেন

+1 এই আসল ইন্ডেন্টেশনের জন্য নয়, তবে এটি এই উদাহরণের সেরা সমাধান ।
মার্ক হুরড

2
কেবলমাত্র অন্য দুর্ঘটনাক্রমে স্বয়ংক্রিয় বিন্যাসটি সমস্ত
इंडেন্টিং

2

মন্দ হতে দূরে, টেরিনারি অপারেটর একটি গডসেন্ড।

  • আপনি নেস্টেড মতপ্রকাশে কোনও সিদ্ধান্ত নিতে চাইলে এটি সবচেয়ে কার্যকর । ক্লাসিক উদাহরণ একটি ফাংশন কল:

    printf("I see %d evil construct%s in this program\n", n, n == 1 ? "" : "s");
    
  • আপনার নির্দিষ্ট উদাহরণে, এই তিনটি প্রায় কৃতজ্ঞ, কারণ এটি একটি এর অধীনে শীর্ষ-স্তরের প্রকাশ return। আপনি returnকীওয়ার্ড ব্যতীত অন্য কোনও সদৃশ ছাড়াই শর্তসাপেক্ষে বিবৃতি স্তরে উন্নীত করতে পারেন ।

NB কিছুই কখনওই সেই নির্দিষ্ট অ্যালগরিদমকে মধ্যমদের পক্ষে পড়া সহজ করে না।


এতটা পঠনযোগ্য হওয়া শক্ত যে আপনি এটি আরও ভাল করে তুলতে পারবেন না। printf("I see %d evil construct%s in this program\n", n, "s" unless (n == 1) "s");
পেসারিয়ার

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

  2. টেরিনারি অপারেটররা যাদুর সংখ্যাগুলি s ** টি ফ্লাইগুলিকে আকর্ষণ করে।

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


2

এটি কখন খারাপ হয় তার উদাহরণ এখানে :

oldValue = newValue >= 0 ? newValue : oldValue;

এটা বিভ্রান্তিকর এবং অপব্যয়। কম্পাইলার পারে দ্বিতীয় অভিব্যক্তি (oldValue = oldValue) আউট নিখুত, কিন্তু কেন সংকেতপদ্ধতিরচয়িতা প্রথম স্থানে এই কাজ করেছিলেন?

আরেকটি ধুতা:

thingie = otherThingie != null ? otherThingie : null;

কিছু লোককে কেবল কোডার হিসাবে বোঝানো হয় না ...

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

if ('a' == $s) return 1;
if ('b' == $s) return 2;
if ('c' == $s) return 3;
return 4;

যা ত্রৈমাসিকের চেয়ে কোলাহলপূর্ণ নয়। আমি ভাবছি যদি টের্নারি শর্ট-কাট করে; সমস্ত এক্সপ্রেশন মূল্যায়ন করা হয়?


আপনার দ্বিতীয় উদাহরণটি আমাকে স্মরণ করিয়ে দেয় if (x != 0) x = 0;...
ফ্রেডওভারফ্লো

2

ইভিল? দেখুন, তারা ঠিক অন্যরকম।

ifএকটি বিবৃতি। (test ? a : b)একটি অভিব্যক্তি। তারা একই জিনিস না।

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

ত্রৈমাসিক অভিব্যক্তির একটি মান এটি আপনাকে সত্য এবং মিথ্যা উভয় ক্ষেত্রেই পরিচালনা করতে সক্ষম করে। ifবিবৃতি না।

আপনি যদি পঠনযোগ্যতা সম্পর্কে চিন্তিত হন তবে আপনি সেগুলি সহজেই বিন্যাস করতে পারেন।

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


1
সন্দেহভাজন কে সে সম্পর্কে কি আমি ইঙ্গিত দিতে পারি? শুধু আমার ক্ষেত্র সম্পর্কে আমার জ্ঞান উন্নত করতে।
mlvljr

1
@ এমএলভিএলজেআর: ঠিক আছে আমি ভুল হতে পারি, তাই না করাই ভাল।
মাইক ডুনলাভে

1

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

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


1

আমি মনে করি না যে টার্নারি অপারেটরটি মন্দ।

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


1

আপনার কোডকে কুশ্রী করে তোলে এমন কোনও কিছুই মন্দ।

আপনি যদি নিজের কোডটি ক্লিনার করতে টের্নারি ব্যবহার করেন তবে অবশ্যই এটি ব্যবহার করুন। কখনও কখনও পিএইচপি এর মতো ইনলাইন বিকল্পগুলি করা দুর্দান্ত

"Hello ".($Male?"Mr":"Ms")." $Name

এটি কয়েকটি লাইন সংরক্ষণ করে এবং এটি বেশ পরিষ্কার clear


1

আমি কি এটা বলতে পারি? আমি টার্নারি অপারেশনের মন্দের এই নির্দিষ্ট অ্যাপ্লিকেশনটি খুঁজে পেতে পরিচালনা করতে পারি না :

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

দয়া করুন, আমার খ্যাতি ইতিমধ্যে বেশ করুণাময়।


1

বৃহত্তম জয়: দেখানো হচ্ছে যে কর্মের একক লক্ষ্য রয়েছে।

if ( $is_whatever )
    $foo = 'A';
else
    $foo = 'B';

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

if ( $is_whatever )
    $foo = 'A';
else
    $bar = 'B';

টেরিনারি অপারেটরের সাথে, এটি স্পষ্ট যে কেবলমাত্র একটি ভেরিয়েবল সেট করা হচ্ছে।

$foo = $is_whatever ? 'A' : 'B';

খুব নিচু স্তরে এটি ডিআরওয়াই (নিজেকে পুনরাবৃত্তি করবেন না) নীতিটি এর সবচেয়ে বেসিক। আপনি যদি $fooএকবার নির্দিষ্ট করতে পারেন তবে তা করুন।


0

যদি ... তবে ... অন্যথায় শর্তটির উপর জোর দেওয়া এবং শর্তসাপেক্ষে অপারেশনগুলি ডি-জোর দেওয়া উচিত।

টেরিনারি অপারেটর বিপরীত, এটি শর্তটি আড়াল করে এবং যখন অপারেশন করা হচ্ছে তখন শর্তের চেয়েও গুরুত্বপূর্ণ useful

কিছু ভাষায়, গৌণ প্রযুক্তিগত নিগল রয়েছে যে একটি স্টেটমেন্ট এবং একটি এক্সপ্রেশন হওয়ার কারণে এগুলি একে অপরের মত বিনিময়যোগ্য নয় যেমন শর্তসাপেক্ষে সি ++ এ কনসেন্ট শুরুর দিকে


0

কখন উপযুক্ত, এবং কখন নয়?

আমি মনে করি যে একজাতীয় গোষ্ঠীর লোকদের জন্য বিকাশ করার সময় কোনও সমস্যা নেই তবে যখন আপনাকে বিভিন্ন স্তরের হ্যান্ডেল করা লোকদের সাথে ডিল করতে হয়, তখন এই ধরণের অনেলাইনাররা কোডটিতে সম্পূর্ণ মাত্রার আরও একটি স্তর প্রবর্তন করে। সুতরাং, বিষয়টি সম্পর্কে আমার নীতিমালাটি হ'ল: কোডটি সংক্ষিপ্ত কোডের চেয়ে কোড স্পষ্ট এবং ব্যাখ্যা না করে 123123 বার ব্যাখ্যা করুন।

এটি শিখানো উচিত বা প্রাথমিক থেকে গোপন করা উচিত?

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


0

আইএমও, অপারেটর নিজেই খারাপ নয়, তবে সি (এবং সি ++) এর জন্য ব্যবহৃত সিনট্যাক্স অত্যধিক সংশ্লেষযোগ্য। IMO, Algol 60 এটি আরও ভাল করেছে, তাই এরকম কিছু:

A = x == y ? B : C;

আরও দেখতে এটি দেখতে (তবে সাধারণভাবে সি-এর মতো সিনট্যাক্সের সাথে লেগে থাকা):

A = if (x==y) B else C;

এমনকি এটির সাথেও, অত্যধিক গভীর বাসা বাঁধার কারণে পাঠযোগ্যতা নিয়ে সমস্যা দেখা দিতে পারে তবে কমপক্ষে এ) যে কেউ প্রোগ্রামিং করেছেন সে এটিকে একটি সাধারণ চিত্র খুঁজে বের করতে পারে, এবং খ) যে লোকেরা এটি বোঝে তারা যথেষ্ট গভীর বাসা বাঁধতে পারে খুব সহজেই। OTOH, আমি আরও লক্ষ করেছি যে এলআইএসপিতে (উদাহরণস্বরূপ) একটি condঅনেকটা ত্রৈমাসিকের স্টেটমেন্টের মতো - বিবৃতিগুলির সেট নয়, তবে একটি একক অভিব্যক্তি একটি মান দেয় (তারপরে, বেশিরভাগ এলআইএসপি এর মতো হয় ..) ।)


কেন কেবল পাঠযোগ্যতার জন্য এটি করবেন না? A = (x==y) ? B : C
জেরেমি হিলার

@ জেরেমি: কিছু লোক প্যারেন্সকে দরকারী বলে মনে করেন, এমনকি সর্বোপরি তারা খুব বেশি সহায়তা করেন না । দু'জনেরও বেশি গভীর নীড় এবং জিনিসগুলি সাজানোর জন্য আপনার এখনও সতর্কতা অবলম্বন করতে হবে (খালি ন্যূনতম হিসাবে)। নিঃসন্দেহে আলগোলের ক্ষেত্রেও একই ঘটনা ঘটবে, তবে আমি কখনই বলি না যে এতে সমস্যা দেখা দেয় যেমন আমি প্রায়শই সি তে করি ...
জেরি কফিন

আমি কেবল ধরে নিয়েছি যে সকলেই একমত ছিল যে কোনও টের্নারি অপারেটরকে বাসা বাঁধাই খারাপ। আপনার দেওয়া উদাহরণগুলি সম্পর্কে আমি বিশেষভাবে বলছিলাম। বিশেষত, প্রথম ভাষাটি কীভাবে বেশিরভাগ ভাষায় দ্বিতীয়টির মতো হতে পারে।
জেরেমি হিলার

0

এমন একটি দোকান যা নিয়মিতভাবে 600-1200-লাইনের পদ্ধতিগুলি লেখেন আমাকে এমনটি বলা উচিত নয় যে একটি টার্নারি "বোঝা শক্ত"। কোন দোকান যে নিয়মিতভাবে পাঁচটি অবস্থার নির্ণয় করা একটি কোড শাখা পারবেন উচিত নয় আমাকে একটি তিন যে মূর্তভাবে সংক্ষিপ্ত অবস্থার বলুন "পড়তে কঠিন" হয়।


0

কখন?: উপযুক্ত, এবং কখন নয়?

  • আপনি যদি কোনও পারফরম্যান্স লাভ না পান তবে এটি ব্যবহার করবেন না; এটি আপনার কোডের পঠনযোগ্যতাকে প্রভাবিত করে।
  • এটি একবার ব্যবহার করুন এবং এটি বাসা না।
  • এটি ডিবাগ করা কঠিন।

এটি শিখানো উচিত বা প্রাথমিক থেকে গোপন করা উচিত?

কিছু যায় আসে না, তবে এটি "শিক্ষানবিশ" শেখার পক্ষে জটিল নয় বলে এটি ইচ্ছাকৃতভাবে লুকানো উচিত নয়।


-2

আপনার উদাহরণে:

def median(a, b, c):
    if a < b < c: return b
    if a < c < b: return c
    if b < a < c: return a
    if b < c < a: return c
    if c < a < b: return a
    if c < b < a: return b

পড়া খুব সহজ, এবং সুস্পষ্ট। <<< এর মধ্যে পরিবর্তনশীল হ'ল ফেরতের মান value

হালনাগাদ

একই, তবে কোডের কম লাইন। এখনও সহজ আমি মনে করি।

def median(a, b, c):
    if b<a<c or c<a<b: return a
    if a<b<c or c<b<a: return b
    if a<c<b or b<c<a: return c

এর জন্য সবচেয়ে খারাপ ক্ষেত্রে 12 তুলনা দরকার ...
ফ্রেডওভারফ্লো

1
সম্ভবত, তবে এটি সুস্পষ্ট।
ক্রিস্টোফার মহান

-2

এটি কনস্টের জন্যও প্রয়োজনীয়

const int nLegs  = isChicken ? 2: 4 ;

স্ট্রেঞ্জ। আমি মনে করি এটির সি ++ বা অন্য কিছু। আমি ভেবেছিলাম কনস্ট সবসময় সংকলন সময় ধ্রুবক ছিল (সি # হিসাবে)
নওফাল

@ নওফাল - আপনি যদি রানটাইম অবধি চিকেন না জানেন
মার্টিন বেকেট

হ্যাঁ কি হয়। আমি মনে করি constনির্দিষ্ট ভাষায়ও তাই। সি # তে constসর্বদা সময়যুক্ত মানটি সংকলন করা উচিত। যার অর্থ const int nLegs = isChicken ? 2: 4 ;const int nLegs = true ? 2: 4 ;
অভ্যাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.