বুলিয়ান এক্সপ্রেশনগুলিতে নাল কন্ডিশনাল অপারেটরগুলি ব্যবহার করার সর্বোত্তম উপায়


11

আপনি এমন একটি বুলিয়ান এক্সপ্রেশন লিখছেন যা দেখতে এরকম দেখতে পারে:

team.Category == "A Team" && team?.Manager?.IsVietnamVet

public class Manager
{
    public bool IsVietnamVet { get; set; }
}

public class Team
{
    public string Category { get; set; }

    public Manager Manager { get; set; }
}

... এবং আপনি একটি ত্রুটি পান:

অপারেটর '&&' টাইপ 'বুল' এবং 'বুল' এর অপারেশনগুলিতে প্রয়োগ করা যাবে না?

এটি পরিচালনা করার সর্বোত্তম / পরিষ্কার উপায় কী?

  1. team.Category == "A Team" && (team?.Manager?.IsVietnamVet ?? false)

    এটা কি সত্যিই পঠনযোগ্য?

  2. team.Category == "A Team" && (team?.Manager?.IsVietnamVet).GetValueOrDefault()

    এটি লিনকিউ-থেকে-সত্তাগুলিতে কাজ নাও করতে পারে ...

  3. team.Category == "A Team" && team?.Manager?.IsVietnamVet == true

    আপনি কি সত্যিই if (condition == true)কোনও দ্বিধা ছাড়াই লিখবেন ?

অন্য কোন বিকল্প আছে? এটি লিখতে চূড়ান্ত ভাল:

  1. team.Category == "A Team" && team.Manager != null && team.Manager.IsVietnamVet

যদি (! (স্ট্রিং.আইএসনুলআরএম্পটি (দল। ম্যানেজার) এবং& শর্ত)) ...
স্নুপ

1
@ স্টেভিভিও প্রথম থেকেই ঠিক এইরকম হওয়া ঠিক ছিল না;)
সান্থোস

1
কোডটি আরও সাবধানতার সাথে দেখলে, নাল শর্তযুক্ত অংশ হওয়া উচিত team.Manager?.IsVietnamVet, অর্থাত্ কোনও নাল শর্তসাপেক্ষ পরে নেই team, কারণ ইতিমধ্যে তা হতে পারে না null
সোভিক

2
"বিনা দ্বিধায় থাকলে (শর্ত == সত্য) আপনি কি সত্যিই লিখবেন?" একটি সাধারণ বুলিয়ান জন্য, না, যেহেতু এটি অতিমাত্রায় হয়। যাইহোক, একটি nullaable বুলেট জন্য , এটি প্রাসঙ্গিক। nullableBool == trueমূলত পরীক্ষার জন্য nullableBool != false && nullableBool != null(এবং এটি এটি দ্বিতীয় অংশ যা এটি দরকারী এবং অতএব অতিরিক্ত প্রয়োজন নয়)
ফ্ল্যাটার

2
আমি nullableBool == trueযদি একটি মোড়ক তৈরি না করি তবে আমি ব্যবহার শুরু করি। এটি পঠনযোগ্য কারণ == true@ ফ্লাটারের উল্লেখ হিসাবে আপনি নিয়মিত বুলিয়ান ব্যবহার করার সময় সাধারণত লিখেন না , সুতরাং এটি প্রস্তাবিত হয় যে পরিবর্তনশীলটি নালাগ্র। অ্যাডিশনালি, এটি লিনকিউ পঠনযোগ্যতার উন্নতি করে কারণ আপনি @ ফাবিও উল্লেখ করেছেন একাধিক নাল শর্ত ব্যবহার করবেন না।
সান্থোস

উত্তর:


4

এই বিশেষ ক্ষেত্রে, এটা জ্ঞানী অনুসরণ করতে হতে পারে Demeter আইন অর্থাত

public class Team
{
    public bool IsManagerVietnamVet => Manager?.IsVietnamVet ?? false;
}    

আরও সাধারণভাবে, যদি কোনও বুলিয়ান এক্সপ্রেশন জটিল বা কুরুচিপূর্ণ হয় তবে আপনি এটি (বা এর অংশ) একটি পৃথক বিবৃতিতে ভাগ করতে পারছেন না বলে কিছু নেই:

bool isVietnamVet = Manager?.IsVietnamVet ?? false;

if (team.Category == "A Team" && isVietnamVet)

ডিবাগারে কোড দিয়ে যাওয়ার সময়, boolকিছুটা মাউসওভার-হোভারিং বাঁচাতে কেবলমাত্র একটি বিস্তৃত শর্তগুলি একক মধ্যে প্যাকেজ করা ভাল ; প্রকৃতপক্ষে, পুরো জিনিসটি একটি boolভেরিয়েবলের মধ্যে রেখে দেওয়া ভাল লাগবে ।

bool isVietnamVetAndCategoryA = (team.Category == "A Team"
    && Manager?.IsVietnamVet ?? false);

if (isVietnamVetAndCategoryA)

বা লিনকিউ সহ:

var wibble = from flight in airport
             from passenger in flight.manifest
             let isOnPlane = 
                 (flight.FinishedBoarding && passenger.Flight == flight.FlightNumber)
             where !isOnPlane
             select passenger;

আমি মনে করি আমি বেশিরভাগ ক্ষেত্রে এই জাতীয় সমাধানের দিকে ঝুঁকছি।
সাঁথোস

1
কয়েকটি লাইন সংরক্ষণের জন্য নতুন সি # বাক্য গঠন: পাবলিক বুল ইসম্যানেজারভিটনাভিট => (টিম.শ্রেণী == "") && (টিম.ম্যানেজার? .আইএসভিটনমেট ?? মিথ্যা);
গ্রাহাম

কেবল মনে রাখবেন যে লম্বা a && b && c &&...ক্রমিকভাবে মৃত্যুদন্ড কার্যকর করা হয় এবং পরেরটিটি পূর্বেরটি হলেও কার্যকর হয় না false। সুতরাং লোকে সাধারণত শুরুতে দ্রুততম রাখে। মনের মধ্যে যে রাখুন যখন একটি পৃথক bool,-Var মধ্যে কাপড় চলন্ত
jitbit

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

@ বেনকোটারেল আমি IsManagerVietnamVetসম্পত্তিটিকে একটি ডাটাবেসে যাচাই করতে গেলে আমি এটি "মাইক্রো" অপ্টিমাইজেশন
বলব

3

আমি মনে করি বিকল্প 3 (অর্থাত == true) যে একটি পরীক্ষা পরিষ্কার উপায় bool?হল true, কারণ এটি এটি কী জন্য আমাদের কাছে স্পষ্ট নয়।

বেশিরভাগ কোডে এটি x == trueবোঝা যায় না, কারণ এটি একইরকম x, তবে এটি এখানে প্রযোজ্য নয়, তাই আমি মনে করি == trueখুব বিভ্রান্তিকর হবে না।


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

1
@ সাঁথোস - পুনরায় "প্রোগ্রামারের উদ্দেশ্যটি কিছুটা পরিষ্কার হয়ে গেছে"। আইএমএইচও, এটি এমন একটি ঘটনা যেখানে কোনও প্রোগ্রামার প্রথমবার দেখলে a?.b == trueতারা বিভ্রান্ত হয়ে পড়বে, তবে তারা যখন এটি কী করছে তা বুঝতে পেরে এটি একটি খুব সহজেই পঠনযোগ্য প্রতিমা হয়ে ওঠে != null, একটি জটিল অভিব্যক্তির মাঝখানে পরীক্ষা করার চেয়ে ভাল । একই হিসাবে a?.b ?? false, যা মনে হয় সর্বাধিক জনপ্রিয় সমাধান হিসাবে চিহ্নিতকরণ অর্জন করেছে, কারণ এটি আপনি কী টাইপ করবেন তার সাথে মেলে যদি আপনি বুলিয়ান ব্যতীত অন্য কোনও ধরণের সাথে লেনদেন করেন [যদিও আমি এটি বুলিয়ান পছন্দ করি না; আমার জন্য, এটি প্রাকৃতিকভাবে পড়া হয় না; আমি পছন্দ করি == true]।
টুলমেকারস্টেভ

3

বেন কট্রেলের উত্তরের প্রসারিত করে "নাল অবজেক্ট" ধরণ আপনাকে আরও সাহায্য করতে পারে।

কোনও nullদল / পরিচালককে ফিরিয়ে দেওয়ার পরিবর্তে নিষ্কাশন ITeamএবং IManagerইন্টারফেসগুলি এবং অর্থবহ বিকল্প বিকল্প বাস্তবায়ন ফিরিয়ে দিন:

public class NoManager : IManager
{
    public bool IsVietnamVet => false;
}

public class NoTeam : ITeam
{
    public bool ManagedByVietnamVet => false;

    public IManager Manager => new NoManager();
}

তারপরে হঠাৎ করে আপনি team.ManagedByVietnamVetনিরাপদে করতে পারেন ।

এটি অবশ্যই teamনাল-নিরাপদ হতে প্রবাহের সরবরাহকারীর উপর নির্ভর করে - তবে এটি উপযুক্ত পরীক্ষার মাধ্যমে নিশ্চিত করা যায়।


-4

আপনি ব্যবহার করতে পারেন এমন একটি সাধারণ ক্লাস লিখেছিলাম:

 public class MyBool 
    {
        public bool? Value { get; set; }

        public MyBool(bool b)
        {
            Value = b;
        }

        public MyBool(bool? b)
        {
            Value = b;
        }

        public static implicit operator bool(MyBool m)
        {
            return m?.Value ?? false;
        }

        public static implicit operator bool?(MyBool m)
        {
            return m?.Value;
        }

        public static implicit operator MyBool(bool m)
        {
            return new MyBool(m);
        }

        public static implicit operator MyBool(bool? m)
        {
            return new MyBool(m);
        }

        public override string ToString()
        {
            return Value.ToString();
        }
    }

বিশ্বাসযোগ্য যদি কোনও কাস্টম ধরণ ব্যবহার করা যায় অবশ্যই। আপনি এবং MyBoolউভয় সঙ্গে তুলনা করতে পারেন ।boolNullable<bool>


1
এই সাইটটি সফ্টওয়্যার ডিজাইনের বিষয়ে প্রশ্নাবলির জন্য কীভাবে কোডের নির্দিষ্ট টুকরোটি কাজ করতে হয় তার চেয়ে বেশি, সুতরাং যদি আপনি বিশ্বাস করেন যে এটিই সেরা সমাধান তবে আপনার উত্তরটির উপর কেন্দ্রীভূত করা উচিত কেন আপনি কেন এই ধরণের শ্রেণি বিশ্বাস করেন এটি সেরা সম্ভাব্য সমাধান, না এটি বাস্তবায়নের জন্য সঠিক কোড দরকার।
Ixrec
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.