"গ্রুপিং" এনামদের জন্য পতাকা ব্যবহার করা কি ভুল?


12

আমার উপলব্ধি হ'ল [Flag]এনামগুলি সাধারণত এমন জিনিসগুলির জন্য ব্যবহৃত হয় যা একত্রিত হতে পারে, যেখানে পৃথক মানগুলি পারস্পরিক একচেটিয়া নয়

উদাহরণ স্বরূপ:

[Flags]
public enum SomeAttributes
{
    Foo = 1 << 0,
    Bar = 1 << 1,
    Baz = 1 << 2,
}

কোথায় কোন SomeAttributesমান সংমিশ্রণ হতে পারে Foo, Barএবং Baz

আরও জটিল, বাস্তব জীবনের দৃশ্যে আমি একটি এনাম ব্যবহার করে একটি বর্ণনা DeclarationType:

[Flags]
public enum DeclarationType
{
    Project = 1 << 0,
    Module = 1 << 1,
    ProceduralModule = 1 << 2 | Module,
    ClassModule = 1 << 3 | Module,
    UserForm = 1 << 4 | ClassModule,
    Document = 1 << 5 | ClassModule,
    ModuleOption = 1 << 6,
    Member = 1 << 7,
    Procedure = 1 << 8 | Member,
    Function = 1 << 9 | Member,
    Property = 1 << 10 | Member,
    PropertyGet = 1 << 11 | Property | Function,
    PropertyLet = 1 << 12 | Property | Procedure,
    PropertySet = 1 << 13 | Property | Procedure,
    Parameter = 1 << 14,
    Variable = 1 << 15,
    Control = 1 << 16 | Variable,
    Constant = 1 << 17,
    Enumeration = 1 << 18,
    EnumerationMember = 1 << 19,
    Event = 1 << 20,
    UserDefinedType = 1 << 21,
    UserDefinedTypeMember = 1 << 22,
    LibraryFunction = 1 << 23 | Function,
    LibraryProcedure = 1 << 24 | Procedure,
    LineLabel = 1 << 25,
    UnresolvedMember = 1 << 26,
    BracketedExpression = 1 << 27,
    ComAlias = 1 << 28
}

স্পষ্টতই প্রদত্ত Declarationএকটি Variableএবং a উভয়ই হতে পারে না LibraryProcedure- দুটি স্বতন্ত্র মান একত্রিত করা যায় না .. এবং তা হয় না।

যদিও এই পতাকাগুলি অত্যন্ত কার্যকর (প্রদত্তটি DeclarationTypeএকটি Propertyবা একটি তা যাচাই করা খুব সহজ Module) তবে এটি "ভুল" বোধ করে কারণ পতাকাগুলি সত্যই মানগুলির সংমিশ্রণে ব্যবহৃত হয় না , বরং সেগুলি "উপ-প্রকার " গুলিতে বিভক্ত করার জন্য ব্যবহৃত হয়।

সুতরাং আমাকে বলা হয়েছে যে এটি এনাম পতাকাগুলিকে অপব্যবহার করছে - এই উত্তরটি মূলত বলেছে যে আমার কাছে যদি আপেলগুলির জন্য প্রযোজ্য মানগুলির একটি সেট থাকে এবং কমলার ক্ষেত্রে প্রযোজ্য অন্য সেট থাকে তবে আমার কাছে আপেলের জন্য আলাদা এনাম টাইপ এবং কমলার জন্য আরেকটি প্রয়োজন - এখানে সমস্যাটি হ'ল DeclarationTypeবেস Declarationক্লাসে প্রকাশিত হবার সাথে একটি সাধারণ ইন্টারফেসের জন্য আমার সমস্ত ঘোষণা দরকার : PropertyTypeএনাম থাকা মোটেই কার্যকর হবে না।

এটি কি ঝাল / অবাক / আপত্তিজনক নকশা? যদি তাই হয়, তবে কীভাবে সমস্যাটি সাধারণত সমাধান করা হয়?


লোকেরা কীভাবে ধরণের জিনিস ব্যবহার করতে চলেছে তা বিবেচনা করুন DeclarationType। আমি কিনা তা নির্ধারণ করতে বা না চান xএকটি উপপ্রকার হয় y, আমি সম্ভবত সেই লিখতে যেমন চান যাচ্ছি x.IsSubtypeOf(y), যেমন না x && y == y
ট্যানার সোয়েট

1
@ ট্যাননারস্বট এটি ঠিক কি x.HasFlag(DeclarationType.Member)করে ....
ম্যাথিউ গুইন্ডন

হ্যা, এটা সত্য. কিন্তু আপনার পদ্ধতি বলা হয় যদি HasFlagপরিবর্তে IsSubtypeOf, তারপর আমি কিছু প্রয়োজন অন্যান্য দুঃশ্চিন্তা যে কি এটা সত্যিই মানে প্রণালী "এর উপপ্রকার হয়"। আপনি একটি এক্সটেনশান পদ্ধতি তৈরি করতে পারেন, তবে একজন ব্যবহারকারী হিসাবে আমি যেটাকে অবাক করেছিলাম তা হ'ল DeclarationTypeএকটি কাঠামো যা সত্য পদ্ধতি IsSubtypeOfহিসাবে রয়েছে ।
ট্যানার সোয়েট

উত্তর:


10

এটি অবশ্যই এনাম এবং পতাকাগুলিকে আপত্তিজনক! এটি আপনার পক্ষে কাজ করতে পারে তবে কোডটি পড়া অন্য যে কেউ জোর করে বিভ্রান্ত হতে চলেছে।

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনার কাছে ঘোষণার শ্রেণিবিন্যাসের শ্রেণিবদ্ধকরণ রয়েছে। এই পর্যন্ত একটি একক enum মধ্যে সঙ্কেতাক্ষরে লিখা অনেক তথ্য রয়েছে। তবে একটি সুস্পষ্ট বিকল্প আছে: ক্লাস এবং উত্তরাধিকার ব্যবহার করুন! সুতরাং Memberথেকে উত্তরাধিকার সূত্রে প্রাপ্ত DeclarationType, Propertyথেকে Memberএবং অন্যান্য হিসাবে।

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

সম্পাদনা করুন : আপনার "বাস্তব জীবনের দৃশ্যে" দেখে মনে হচ্ছে এমন একাধিক জায়গা রয়েছে যেখানে এনামের মান অনুসারে আচরণ নির্বাচন করা হয়েছে । এটি সত্যিই একটি অ্যান্টিপ্যাটার্ন, যেহেতু আপনি switch+ enum"দুর্বল ম্যান পলিমারফিজম " হিসাবে ব্যবহার করছেন । ঘোষণা-নির্দিষ্ট আচরণকে এনপ্যাসুলেট করে কেবল এনাম মানকে পৃথক শ্রেণিতে পরিণত করুন এবং আপনার কোডটি আরও পরিষ্কার হবে


উত্তরাধিকার হ'ল একটি ভাল ধারণা তবে আপনার উত্তরটি এনাম প্রতি ক্লাস বোঝায় যা অতিমাত্রার চেয়ে বেশি বলে মনে হয়।
ফ্র্যাঙ্ক হিলিমান

@ ফ্র্যাঙ্কহিল্যান: শ্রেণিবদ্ধের তুলনায় শ্রেণিবিন্যাসের "পাতাগুলি" এনাম মান হিসাবে উপস্থাপিত হতে পারে তবে আমি নিশ্চিত না যে এটি আরও ভাল হবে। নির্ভর করে যদি বিভিন্ন এনভম মানগুলি বিভিন্ন আচরণের সাথে যুক্ত হয় তবে এক্ষেত্রে স্বতন্ত্র শ্রেণিগুলি আরও ভাল।
জ্যাকবিবি

4
শ্রেণিবিন্যাস শ্রেণিবদ্ধ নয়, সংমিশ্রণগুলি পূর্বনির্ধারিত রাজ্যগুলি। এর জন্য উত্তরাধিকার ব্যবহার করা সত্যই অপব্যবহার, শ্রেণীর অপব্যবহার। একটি ক্লাসের সাথে আমি কমপক্ষে কিছু ডেটা বা কিছু আচরণ আশা করি। ক্লাসের একগুচ্ছ হয় না ... ডান, একটি এনাম an
মার্টিন মাট

আমার রেপোটির সেই লিঙ্কটি সম্পর্কে: এনামের চেয়ে প্রতি-টাইপের আচরণের ParserRuleContextউত্পন্ন শ্রেণীর 'টাইপের সাথে আরও কিছু করার রয়েছে । এই কোডটি টোকেনের অবস্থানটি পাওয়ার চেষ্টা করছে যেখানে As {Type}ঘোষণায় কোনও ধারা সন্নিবেশ করা যায় ; ParserRuleContextপার্সার বিধিগুলি সংজ্ঞায়িত করে এমন ব্যাকরণ প্রতি এন্ট্রি 4 দ্বারা এই- শ্রেণীবদ্ধ শ্রেণীর উত্পন্ন হয় - আমি পার্স গাছের নোডগুলির [বরং অগভীর] উত্তরাধিকারের স্তরক্রম নিয়ন্ত্রণ করি না, যদিও আমি তাদের partialইন্টারফেস বাস্তবায়নের জন্য তাদের দক্ষতা অর্জন করতে পারি, উদাহরণস্বরূপ তাদের কিছু AsTypeClauseTokenPositionসম্পত্তি .. অনেক কাজ প্রকাশ করতে ।
ম্যাথিউ গুইনন

6

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

  1. আমার মূল সংরক্ষণ এটি হ'ল এটি কার্যকর করার কোনও উপায় নেই:

    স্পষ্টতই একটি প্রদত্ত ঘোষণাপত্র একটি চলক এবং গ্রন্থাগারপ্রসেসর উভয়ই হতে পারে না - দুটি স্বতন্ত্র মান একত্রিত করা যায় না .. এবং তা হয় না।

    আপনি উপরে সংমিশ্রণটি ঘোষনা করবেন না, এই কোড

    var oops = DeclarationType.Variable | DeclarationType.LibraryProcedure;

    পুরোপুরি বৈধ। এবং সংকলনের সময় এই ত্রুটিগুলি ধরার কোনও উপায় নেই।

  2. আপনি বিট ফ্ল্যাগগুলিতে কতটা তথ্য এনকোড করতে পারবেন তার সীমা রয়েছে, যা কি, 64 বিট? আপাতত আপনি বিপজ্জনক আকারের আকারের কাছাকাছি চলেছেন intএবং যদি এই এনামগুলি বাড়তে থাকে তবে শেষ পর্যন্ত আপনি কেবল বিটগুলি ছাড়িয়ে যাবেন ...

নীচের লাইনটি, আমি মনে করি এটি একটি বৈধ পন্থা, তবে পতাকাগুলির বৃহত / জটিল শ্রেণিবিন্যাসের জন্য আমি এটি ব্যবহার করতে দ্বিধা বোধ করব।


সুতরাং পুঙ্খানুপুঙ্খ বিশ্লেষণকারী ইউনিট পরীক্ষাগুলি যদি তখন # 1 ঠিকানায়। এফডাব্লুআইডাব্লিউ এনামটি প্রায় ৩ বছর আগে স্ট্যান্ডার্ড নো-ফ্ল্যাগস এনাম হিসাবে শুরু হয়েছিল .. এটি সর্বদা কিছু নির্দিষ্ট মান (যা কোড কোড পরিদর্শনে বলা হয়) পরীক্ষা করে ক্লান্ত হয়ে যাওয়ার পরে যে এনাম পতাকাগুলি উপস্থিত হয়েছিল। তালিকাটি সময়ের সাথে সাথে প্রকৃতপক্ষে বৃদ্ধি পাচ্ছে না তবে হ্যাঁ মারার intক্ষমতাটি তবুও এক বাস্তব উদ্বেগ।
ম্যাথিউ গুইনন

3

টিএল; ডিআরএল খুব নীচে স্ক্রোল করুন।


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

এই বিশেষ পরিস্থিতিতে নোডের বিভিন্ন ধরণের মধ্যে খুব কম পলিমারফিক আচরণ রয়েছে। অন্য কথায়, গাছের পক্ষে খুব আলাদা ধরণের (বৈকল্পিক) নোড থাকতে সক্ষম হওয়ার জন্য এই নোডগুলির প্রকৃত দর্শনটি মূলত যদি-তবে-অন্য শৃঙ্খলা (বা instanceof/ isচেকস) একটি দৈত্যের অবলম্বন করবে । এই দৈত্য চেকগুলি সম্ভবত প্রকল্পের বিভিন্ন স্থানে ঘটবে। এ কারণেই এনামগুলিকে সহায়ক বলে মনে হতে পারে, বা তারা কমপক্ষে instanceof/ isচেক হিসাবে সহায়ক ।

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

এটি ক্লাস এবং উত্তরাধিকারের স্তরক্রম কার্যকর নয় বলে নয় to পুরোপুরি বিপরীত. যদিও প্রতিটি ঘোষণার ধরণের জুড়ে কাজ করে এমন বহু বহুবর্ষী আচরণ নেই (প্রতিটি ঘোষণাপত্রের অবশ্যই Nameসম্পত্তি থাকতে হবে তা বাদ দিয়ে ), নিকটবর্তী ভাইবোনদের দ্বারা প্রচুর প্রচুর সমৃদ্ধ পলিমারফিক আচরণ রয়েছে। উদাহরণস্বরূপ, Functionএবং Procedureসম্ভবত কিছু আচরণ ভাগ করুন (উভয় কলযোগ্য এবং টাইপ করা ইনপুট আর্গুমেন্টগুলির একটি তালিকা গ্রহণ করা), এবং PropertyGetঅবশ্যই Function(উভয়ের একটি থাকার ReturnType) থেকে আচরণের উত্তরাধিকারী হবে । আপনি যদি পরে-তে-অন্য শৃঙ্খলার জন্য এনাম বা উত্তরাধিকারের চেক ব্যবহার করতে পারেন তবে পলিমারফিক আচরণগুলি খণ্ডিত হলেও ক্লাসে অবশ্যই প্রয়োগ করা উচিত।

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

এখন এখানে কিছু কংক্রিট পরামর্শ দেওয়া হল।


পাতবিহীন গোষ্ঠীগুলির প্রতিনিধিত্ব করার বিভিন্ন উপায় রয়েছে।


আপনার মূল কোডটির নীচের অংশগুলি তুলনা করুন ...

[Flags]
public enum DeclarationType
{
    Member = 1 << 7,
    Procedure = 1 << 8 | Member,
    Function = 1 << 9 | Member,
    Property = 1 << 10 | Member,
    PropertyGet = 1 << 11 | Property | Function,
    PropertyLet = 1 << 12 | Property | Procedure,
    PropertySet = 1 << 13 | Property | Procedure,
    LibraryFunction = 1 << 23 | Function,
    LibraryProcedure = 1 << 24 | Procedure,
}

এই পরিবর্তিত সংস্করণে:

[Flags]
public enum DeclarationType
{
    Nothing = 0, // to facilitate bit testing

    // Let's assume Member is not a concrete thing, 
    // which means it doesn't need its own bit
    /* Member = 1 << 7, */

    // Procedure and Function are concrete things; meanwhile 
    // they can still have sub-types.
    Procedure = 1 << 8, 
    Function = 1 << 9, 
    Property = 1 << 10,

    PropertyGet = 1 << 11,
    PropertyLet = 1 << 12,
    PropertySet = 1 << 13,

    LibraryFunction = 1 << 23,
    LibraryProcedure = 1 << 24,

    // new
    Procedures = Procedure | PropertyLet | PropertySet | LibraryProcedure,
    Functions = Function | PropertyGet | LibraryFunction,
    Properties = PropertyGet | PropertyLet | PropertySet,
    Members = Procedures | Functions | Properties,
    LibraryMembers = LibraryFunction | LibraryProcedure 
}

এই পরিবর্তিত সংস্করণটি নন-কংক্রিট ঘোষণার ধরণের দিকে বিট বরাদ্দ এড়াতে পারে। পরিবর্তে, নন-কংক্রিট ঘোষণার ধরণের (ঘোষণার ধরণের বিমূর্ত গোষ্ঠীকরণের) এনাম মানগুলি রয়েছে যা এর সমস্ত শিশুদের মধ্যে বিটওয়াইস-বা (বিটের ইউনিয়ন)।

একটি সতর্কবাণী রয়েছে: যদি কোনও বিমূর্ত ঘোষণার প্রকার থাকে যার একটি একা সন্তান থাকে এবং যদি কংক্রিটের (সন্তানের) থেকে বিমূর্ত একটি (পিতামাতার) মধ্যে পার্থক্য করার প্রয়োজন হয়, তবে বিমূর্তটির এখনও তার নিজস্ব বিটের প্রয়োজন হবে ।


এই প্রশ্নের সাথে সুনির্দিষ্ট একটি সতর্কতা: একটি Propertyপ্রাথমিকভাবে একটি সনাক্তকারী (যখন আপনি কোডটিতে এটি কীভাবে ব্যবহৃত হয় তা না দেখেই কেবল তার নামটি দেখেন), তবে এটি কীভাবে ব্যবহৃত হচ্ছে তা দেখলেই এটি PropertyGet/ PropertyLet/ এ সংক্রমণিত হতে পারে PropertySetকোডে অন্য কথায়, পার্সিংয়ের বিভিন্ন পর্যায়ে আপনাকে একটি Propertyসনাক্তকারী চিহ্নিত করতে হবে "এই নামটি কোনও সম্পত্তিকে বোঝায়" এবং পরে পরিবর্তন করতে হবে "কোডের এই লাইনটি একটি নির্দিষ্ট উপায়ে এই সম্পত্তিটি অ্যাক্সেস করছে"।

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


প্রতিটি এনাম মান সম্পর্কে সহায়ক তথ্য পরিবর্তে একটি অ্যারের থেকে পড়া যায় কিনা তা বিবেচনা করুন।

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

public enum DeclarationType
{
    Procedure = 8,
    Function = 9,
    Property = 10,
    PropertyGet = 11,
    PropertyLet = 12,
    PropertySet = 13,
    LibraryFunction = 23,
    LibraryProcedure = 24,
}

static readonly bool[] DeclarationTypeIsMember = new bool[32]
{
    ?, ?, ?, ?, ?, ?, ?, ?,                   // bit[0] ... bit[7]
    true, true, true, true, true, true, ?, ?, // bit[8] ... bit[15]
    ?, ?, ?, ?, ?, ?, ?, true,                // bit[16] ... bit[23]
    true, ...                                 // bit[24] ... 
}

static bool IsMember(DeclarationType dt)
{
    int intValue = (int)dt;
    return (intValue < 0 || intValue >= 32) ? false : DeclarationTypeIsMember[intValue];
    // you can also throw an exception if the enum is outside range.
}

// likewise for IsFunction(dt), IsProcedure(dt), IsProperty(dt), ...

রক্ষণাবেক্ষণ সমস্যা হতে চলেছে।


সি # ধরণের (উত্তরাধিকারের শ্রেণিবিন্যাসের ক্লাস) এবং আপনার এনাম মানগুলির মধ্যে এক থেকে একের ম্যাপিং কিনা তা পরীক্ষা করুন।

(বিকল্পভাবে, এক প্রকারের সাথে এক থেকে এক ম্যাপিং নিশ্চিত করার জন্য আপনি আপনার এনাম মানগুলিকে টুইঙ্ক করতে পারেন))

সি # তে, অনেকগুলি লাইব্রেরি Type object.GetType()ভাল বা খারাপের জন্য নিফটি পদ্ধতিটি অপব্যবহার করে ।

আপনি যে কোনও জায়গায় এনামকে মান হিসাবে সংরক্ষণ করছেন, আপনি নিজেকে জিজ্ঞাসা করতে পারেন যে আপনি Typeপরিবর্তে কোনও মান হিসাবে সঞ্চয় করতে পারবেন কিনা ।

এই কৌশলটি ব্যবহার করতে, আপনি দুটি পঠনযোগ্য হ্যাশ টেবিল শুরু করতে পারেন, যথা:

// For disambiguation, I'll assume that the actual 
// (behavior-implementing) classes are under the 
// "Lang" namespace.

static readonly Dictionary<Type, DeclarationType> TypeToDeclEnum = ... 
{
    { typeof(Lang.Procedure), DeclarationType.Procedure },
    { typeof(Lang.Function), DeclarationType.Function },
    { typeof(Lang.Property), DeclarationType.Property },
    ...
};

static readonly Dictionary<DeclarationType, Type> DeclEnumToType = ...
{
    // same as the first dictionary; 
    // just swap the key and the value
    ...
};

যারা ক্লাস এবং উত্তরাধিকারের শ্রেণিবিন্যাসের পরামর্শ দিচ্ছেন তাদের জন্য চূড়ান্ত প্রতিপত্তি ...

একবার আপনি দেখতে পাচ্ছেন যে এনামগুলি উত্তরাধিকারের শ্রেণিবিন্যাসের একটি অনুমান , নীচের পরামর্শটি ধারণ করে:

  • প্রথমে আপনার উত্তরাধিকারের স্তরক্রম ডিজাইন করুন (বা উন্নত করুন),
  • তারপরে ফিরে যান এবং আপনার এনামগুলিকে আনুমানিক সেই উত্তরাধিকারক্রমক্রম অনুসারে ডিজাইন করুন।

প্রকল্পটি আসলে একটি ভিবিআইডিই অ্যাড-ইন - আমি ভিবিএ কোডটি পার্স করছি এবং বিশ্লেষণ করছি =)
ম্যাথিউ গুইন্ডন

1

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

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

জিনিসযুক্ত এবং জৈব.ফর্ট! = 0

এর চেয়ে বেশি পঠনযোগ্য

জিনিস এবং & (জৈবিক। অ্যাপল | জৈব.অরেনজ | জৈব। পিয়ার)! = 0

ফ্ল্যাগ এনামগুলির মূল বিষয়টি হ'ল আপনাকে একাধিক রাজ্যের একত্রিত করার অনুমতি দেওয়া to আপনি এটিকে আরও কার্যকর এবং পঠনযোগ্য করে তুলেছেন। আপনি আপনার কোডটিতে ফলের ধারণাটি জানান, আপেল এবং কমলা এবং নাশপাতি মানেই ফল বোঝার দরকার নেই।

এই লোকটিকে কিছু ব্রাউন পয়েন্ট দিন!


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