এনামগুলির তালিকা ব্যবহার করা কি ভাল অনুশীলন?


32

আমি বর্তমানে এমন একটি সিস্টেমে কাজ করছি যেখানে ব্যবহারকারী রয়েছে এবং প্রতিটি ব্যবহারকারীর এক বা একাধিক ভূমিকা রয়েছে। ব্যবহারকারীর জন্য এনাম মানগুলির তালিকা ব্যবহার করা কি ভাল অভ্যাস? আমি এর চেয়ে ভাল কিছু ভাবতে পারি না, তবে এটি ঠিক মনে হয় না।

enum Role{
  Admin = 1,
  User = 2,
}

class User{
   ...
   List<Role> Roles {get;set;}
}

6
আমার কাছে ভাল লাগছে, আমি অন্য কারও মন্তব্য বিপরীতে দেখতে আগ্রহী।
ডেভিড শোলফিল্ড

9
@ ম্যাথেররোক একটি দুর্দান্ত ঝাঁকানো সাধারণীকরণকে ধন্যবাদ জানায়। তালিকা <T> .NET বিশ্বে বেশ সাধারণ।
গ্রাহাম

7
@ ম্যাথেররোক। নেট তালিকাটি একটি অ্যারেলিস্ট যা আপনার উল্লেখ করা অ্যালগরিদমের জন্য একই বৈশিষ্ট্য রয়েছে।
এত বিভ্রান্ত

18
@ ম্যাথেরোক - না, আপনি লিঙ্ক তালিকা সম্পর্কে কথা বলছেন, যখন প্রশ্ন এবং অন্য সবাই জেনেরিক তালিকা ইন্টারফেসের বিষয়ে কথা বলছেন।
ডিভোর

5
অটো বৈশিষ্ট্য হ'ল সি # (গেট; সেট; সিনট্যাক্স) এর একটি স্বতন্ত্র বৈশিষ্ট্য। এছাড়াও তালিকার শ্রেণীর নামকরণ।
jaypb

উত্তর:


37

টিএল; ডিআর: এনামগুলির সংকলনটি ব্যবহার করা সাধারণত একটি খারাপ ধারণা কারণ এটি প্রায়শই খারাপ ডিজাইনের দিকে পরিচালিত করে। এনামগুলির একটি সংকলন সাধারণত নির্দিষ্ট যুক্তিযুক্ত স্বতন্ত্র সিস্টেম সত্তাদের জন্য আহ্বান জানায়।

এনামের কয়েকটি ব্যবহারের ক্ষেত্রে এটির মধ্যে পার্থক্য করা প্রয়োজন। এই তালিকাটি কেবল আমার মাথার শীর্ষে রয়েছে যাতে আরও কিছু মামলা হতে পারে ...

উদাহরণগুলি সমস্ত সি # তে রয়েছে, আমি অনুমান করি আপনার পছন্দের ভাষার সাথে একই রকমের গঠন বা তার পক্ষে নিজেকে প্রয়োগ করা সম্ভব হবে।

1. শুধুমাত্র একক মান বৈধ

এই ক্ষেত্রে, মানগুলি একচেটিয়া, যেমন

public enum WorkStates
{
    Init,
    Pending,
    Done
}

উভয় Pendingএবং উভয়ই এমন কিছু কাজ করা অবৈধ Done। সুতরাং এই মানগুলির মধ্যে একটিই বৈধ। এটি এনামের ভাল ব্যবহারের ক্ষেত্রে।

2. মানগুলির সংমিশ্রণ বৈধ হয়
এই [Flags]কেসটিকে পতাকাও বলা হয়, সি # এগুলির সাথে কাজ করার জন্য এনাম অ্যাট্রিবিউট সরবরাহ করে। ধারণাটি প্রতিটি এনাম সদস্যের সাথে সংশ্লিষ্ট প্রতিটি boolবা bitগুলিগুলির সেট হিসাবে তৈরি করা যেতে পারে । প্রতিটি সদস্যের দু'জনের পাওয়ার মান হওয়া উচিত। বিটওয়াইজ অপারেটরগুলি ব্যবহার করে সংমিশ্রণগুলি তৈরি করা যেতে পারে:

[Flags]
public enum Flags
{
    None = 0,
    Flag0 = 1, // 0x01, 1 << 0
    Flag1 = 2, // 0x02, 1 << 1
    Flag2 = 4, // 0x04, 1 << 2
    Flag3 = 8, // 0x08, 1 << 3
    Flag4 = 16, // 0x10, 1 << 4

    AFrequentlyUsedMask = Flag1 | Flag2 | Flag4,
    All = ~0 // bitwise negation of zero is all ones
}

এনাম সদস্যদের সংগ্রহ ব্যবহার করা যেমন একটি ক্ষেত্রে ওভারকিল কারণ প্রতিটি এনাম সদস্য কেবল একটি বিট উপস্থাপন করেন যা হয় সেট করা বা আনসেট করা হয় না। আমার ধারণা, বেশিরভাগ ভাষা এই জাতীয় নির্মাণকে সমর্থন করে। অন্যথায় আপনি একটি তৈরি করতে পারেন (উদাহরণস্বরূপ এটি ব্যবহার bool[]এবং ঠিকানা (1 << (int)YourEnum.SomeMember) - 1)।

ক) সমস্ত সংমিশ্রণগুলি বৈধ

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

[Flags]
public enum Flavors
{
    Strawberry = 1,
    Vanilla = 2,
    Chocolate = 4
}

public class IceCream
{
    private Flavors _scoopFlavors;

    public IceCream(Flavors scoopFlavors)
    {
        _scoopFlavors = scoopFlavors
    }

    public bool HasFlavor(Flavors flavor)
    {
        return _scoopFlavors.HasFlag(flavor);
    }
}

(দ্রষ্টব্য: এটি ধরে নিয়েছে যে আপনি কেবল আইসক্রিমের স্বাদ সম্পর্কেই যত্নশীল - আপনাকে আইসক্রিমকে স্কুপ এবং শঙ্কু সংগ্রহ হিসাবে মডেল করার দরকার নেই)

খ) মানগুলির কয়েকটি সমন্বয় বৈধ এবং কিছু নয়

এটি একটি ঘন ঘন দৃশ্য। কেসটি প্রায়শই এমন হতে পারে যে আপনি একটি এনামে দুটি আলাদা জিনিস রাখছেন। উদাহরণ:

[Flags]
public enum Parts
{
    Wheel = 1,
    Window = 2,
    Door = 4,
}

public class Building
{
    public Parts parts { get; set; }
}

public class Vehicle
{
    public Parts parts { get; set; }
}

এখন যখন এটি উভয়ের জন্য সম্পূর্ণরূপে বৈধ নয় Vehicleএবং Buildingআছে Doors এবং Windowগুলি, তাই না খুব স্বাভাবিক জন্য Buildingগুলি আছে Wheelসে।

এক্ষেত্রে, # 1 বা # 2a কেস অর্জনের জন্য এনামগুলি অংশগুলিতে বিভক্ত করা এবং / অথবা বস্তুক্রমক্রমকে সংশোধন করা ভাল।

ডিজাইন বিবেচ্য বিষয়

একরকম, এনামগুলি OO- এ ড্রাইভিং উপাদান হিসাবে বিবেচনা করে না, কারণ কোনও সত্তার ধরণটি সাধারণত একটি এনাম দ্বারা সরবরাহ করা তথ্যের অনুরূপ বিবেচনা করা যেতে পারে।

উদাহরণস্বরূপ IceCream# 2 থেকে নমুনা নিন , IceCreamসত্তার পতাকার পরিবর্তে Scoopবস্তুগুলির সংগ্রহ থাকবে ।

Scoopকোনও Flavorসম্পত্তি থাকার জন্য কম পিউরিস্ট পদ্ধতির পক্ষে হবে approach প্রকৃতিবাদী পদ্ধতির হতে জন্য হবে Scoopএকটি বিমূর্ত বেস বর্গ হতে VanillaScoop, ChocolateScoop... শ্রেণীর পরিবর্তে।

নীচের লাইনটি হ'ল:
১. যে কোনও কিছু "প্রকারের কিছু" হিসাবে এনামের দরকার
হয় না some

এখন আপনার উদাহরণের জন্য (সামান্য পরিবর্তিত):

public enum Role
{
    User,
    Admin
}

public class User
{
    public List<Role> Roles { get; set; }
}

আমি মনে করি এই সঠিক কেসটি মডেল করা উচিত (দ্রষ্টব্য: সত্যই এক্সটেনসিবল নয়!):

public class User
{
    public bool IsAdmin { get; set; }
}

অন্য কথায় - এটা অন্তর্নিহিত হয়, যে Userএকটি হল User, অতিরিক্ত তথ্য কিনা সে একটি হল Admin

আপনি একাধিক ভূমিকাগুলি দেখে একচেটিয়া নয় আছে পেলে (যেমন Userহতে পারে Admin, Moderator, VIP, ... একই সময়ে), যে হয় পতাকার enum ব্যবহার করার জন্য একটি ভাল সময় অথবা একটি abtract বেস বর্গ বা ইন্টারফেস হবে।

কোনও শ্রেণি ব্যবহার করে Roleনেতৃত্বের প্রতিনিধিত্ব করার জন্য দায়িত্বের আরও ভাল বিভাজনের দিকে পরিচালিত হয় যেখানে Roleকোনও প্রদত্ত ক্রিয়াটি করতে পারে কিনা তা সিদ্ধান্ত নেওয়ার দায়িত্ব একজনের নিতে পারে।

একটি এনামের সাথে আপনার সমস্ত ভূমিকার জন্য যুক্তি যুক্ত করতে হবে। যা ওওর উদ্দেশ্যকে পরাস্ত করে এবং আপনাকে অত্যাবশ্যকীয় দিকে ফিরিয়ে আনে।

কল্পনা করুন যে একটিতে Moderatorসম্পাদনা করার অধিকার রয়েছে এবং Adminএতে সম্পাদনা এবং মুছুন উভয়ই অধিকার রয়েছে।

এনাম এপ্রোচ ( Permissionsভূমিকা এবং অনুমতিগুলিকে মিশ্রিত না করার জন্য ডাকা হয়):

[Flags]
public enum Permissions
{
    None = 0
    CanEdit = 1,
    CanDelete = 2,

    ModeratorPermissions = CanEdit,
    AdminPermissions = ModeratorPermissions | CanDelete
}

public class User
{
    private Permissions _permissions;

    public bool CanExecute(IAction action)
    {
        if (action.Type == ActionType.Edit && _permissions.HasFlag(Permissions.CanEdit))
        {
            return true;
        }

        if (action.Type == ActionType.Delete && _permissions.HasFlag(Permissions.CanDelete))
        {
            return true;
        }

        return false;
    }
}

শ্রেণি পদ্ধতির (এটি নিখুঁত থেকে অনেক দূরে, আদর্শভাবে, আপনি IActionএকটি দর্শনার্থীর প্যাটার্নে এটি দেখতে চাই তবে এই পোস্টটি ইতিমধ্যে প্রচুর ...):

public interface IRole
{
    bool CanExecute(IAction action);
}

public class ModeratorRole : IRole
{
    public virtual bool CanExecute(IAction action)
    {
         return action.Type == ActionType.Edit;
    }
}

public class AdminRole : ModeratorRole
{
     public override bool CanExecute(IAction action)
     {
         return base.CanExecute(action) || action.Type == ActionType.Delete;
     }
}

public class User
{
    private List<IRole> _roles;

    public bool CanExecute(IAction action)
    {
        _roles.Any(x => x.CanExecute(action));
    }
}

এনাম ব্যবহার করা একটি গ্রহণযোগ্য পদ্ধতির হতে পারে যদিও (উদাহরণস্বরূপ কর্মক্ষমতা)। এখানে সিদ্ধান্ত মডেলিং সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে।


3
আমি মনে করি না যে [Flags]প্রচ্ছন্নতার চেয়ে সমস্ত সংমিশ্রণগুলি বৈধ হ'ল এই জাতীয় চারটি বিলিয়ন মানই বৈধ। এটা শুধু মানে তারা করতে পারেন একটি একক ক্ষেত্র মধ্যে একত্রিত করা - সমন্বয় ওপর কোনো নিষেধাজ্ঞা উচ্চ স্তরের যুক্তিবিজ্ঞান জন্যে।
র্যান্ডম 832

সতর্কতা: ব্যবহার করার সময় [Flags], আপনার দুটি মানকে মান নির্ধারণ করা উচিত, অন্যথায় এটি প্রত্যাশার মতো কাজ করবে না।
আর্টুরো টরেস সানচেজ

@ র্যান্ডম 832 আমার কখনও এটি বলার উদ্দেশ্য ছিল না তবে আমি উত্তরটি সম্পাদনা করেছি - আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
জেডেনেক জেলেনেক

1
@ আরতুরো টরেস সানচেজ ইনপুট দেওয়ার জন্য আপনাকে ধন্যবাদ, আমি উত্তরটি স্থির করেছি এবং সে সম্পর্কে একটি ব্যাখ্যামূলক নোটও যুক্ত করেছি।
জেডেনেক জেলেনেক

দুর্দান্ত ব্যাখ্যা! প্রকৃতপক্ষে পতাকাগুলি সিস্টেমের প্রয়োজনীয়তাগুলি খুব ভালভাবে ফিট করে তবে বিদ্যমান পরিষেবা প্রয়োগের কারণে এটি হ্যাশসেটগুলি ব্যবহার করা আরও সহজ হবে।
ডেক্সি

79

সেট ব্যবহার করবেন না কেন? তালিকা ব্যবহার করা হলে:

  1. দু'বার একই ভূমিকা যুক্ত করা সহজ
  2. তালিকাভুক্ত তালিকা তুলনামূলকভাবে এখানে সঠিকভাবে কাজ করবে না: [ব্যবহারকারী, প্রশাসক] [প্রশাসক, ব্যবহারকারী] এর মতো নয়
  3. ছেদ করা এবং মার্জ করার মতো জটিল ক্রিয়াকলাপগুলি বাস্তবায়নের জন্য সোজা নয়

আপনি যদি পারফরম্যান্স সম্পর্কে উদ্বিগ্ন হন তবে জাভাতে উদাহরণস্বরূপ EnumSet, বুলিয়ানগুলির নির্দিষ্ট দৈর্ঘ্যের অ্যারে হিসাবে প্রয়োগ করা হয় (আমি বুলিয়ান উপাদান এই প্রশ্নের উত্তর দেয় যে এনাম মান এই সেটে উপস্থিত কিনা তা নয়)) উদাহরণস্বরূপ EnumSet<Role>,। এছাড়াও, দেখুন EnumMap। আমি সন্দেহ করি যে সি # এরও কিছু মিল রয়েছে।


35
আসলে জাভা EnumSetগুলি বিট ক্ষেত্র হিসাবে প্রয়োগ করা হয়।
বিজিক্লপ

4
উপর সংশ্লিষ্ট তাই প্রশ্ন HashSet<MyEnum>বনাম পতাকা enums: stackoverflow.com/q/9077487/87698
Heinzi

3
.NET এর রয়েছে FlagsAttribute, যা আপনাকে এনটগুলিতে কনটাক্ট করতে বিটওয়াইজ অপারেটরগুলি ব্যবহার করতে দেয়। জাভা অনুরূপ EnumSetএমএসডিএন.মাইক্রোসফট.এইন / ইউএস / এলবিআরআই / সিস্টেমে.ফ্লেগস্যাট্রিবিউট সম্পাদনা: আমার একটা উত্তর খুঁজে পাওয়া উচিত ছিল! এটির একটি ভাল উদাহরণ রয়েছে।
পিএস

4

আপনার এনাম লিখুন যাতে আপনি সেগুলি একত্রিত করতে পারেন। বেস 2 এক্সফেনশনাল ব্যবহার করে আপনি সেগুলিকে এক এনামে একত্রিত করতে পারেন, 1 টি সম্পত্তি থাকতে পারেন এবং তাদের জন্য পরীক্ষা করতে পারেন। আপনার এনাম এটি লিলি হওয়া উচিত

enum MyEnum
{ 
    FIRST_CHOICE = 2,
    SECOND_CHOICE = 4,
    THIRD_CHOICE = 8
}

3
আপনি 1 ব্যবহার করছেন না এমন কোনও কারণ?
রবি ডি

1
@RobbieDee কোন effectivly আমি 1 ব্যবহৃত থাকতে পারে, 2, 4, 8, ইত্যাদি তুমি ডান
Rémi

5
ঠিক আছে, আপনি যদি জাভা ব্যবহার করেন তবে এটি ইতিমধ্যে এর জন্য এটি EnumSetপ্রয়োগ করে enum। আপনার কাছে সমস্ত বুলিয়ান পাটিগণিত ইতিমধ্যে বিমূর্ত হয়েছে, আরও সহজে ব্যবহারের সহজ করার জন্য আরও কিছু পদ্ধতি, ছোট স্মৃতি এবং ভাল পারফরম্যান্স।
31

2
@ fr13d আমি এসি # ছেলে এবং যেহেতু প্রশ্নের কোনও জাভা ট্যাগ নেই বলে আমি মনে করি এই উত্তরটি আরও বেশি প্রয়োগ হয়
রামি

1
ডান, @ রামি। সি # [flags]বৈশিষ্ট্যটি সরবরাহ করে , যা @ জেডেনেক জেলেনেক তার পোস্টে অনুসন্ধান করেছেন
fr13d

4

ব্যবহারকারীর জন্য এনাম মানগুলির তালিকা ব্যবহার করা কি ভাল অভ্যাস?


সংক্ষিপ্ত উত্তর : হ্যাঁ


সর্বোত্তম সংক্ষিপ্ত উত্তর : হ্যাঁ, এনাম ডোমেনের কিছু সংজ্ঞা দেয়।


নকশাকালীন সময় উত্তর : ক্লাস, কাঠামো ইত্যাদি তৈরি করুন এবং ব্যবহার করুন যা ডোমেনটির নিজের ক্ষেত্রেই মডেলটিকে মডেল করে।


কোডিংয়ের সময় উত্তর : এখানে কীভাবে এনলিং- কোডিং করা যায় ...


অনুমিত প্রশ্ন :

  • আমার কি স্ট্রিং ব্যবহার করা উচিত?

    • উত্তর: না
  • আমার কি অন্য কোন ক্লাস ব্যবহার করা উচিত?

    • হ্যাঁ ছাড়াও। পরিবর্তে, না।
  • Roleএনাম তালিকাটি কি ব্যবহারের জন্য যথেষ্ট User?

    • আমার কোন ধারণা নাই. এটি প্রমাণ হিসাবে নয় অন্যান্য নকশা বিবরণ উপর অত্যন্ত নির্ভরশীল।

ডব্লিউটিএফ বব?

  • এটি একটি ডিজাইনের প্রশ্ন যা প্রোগ্রামিং ভাষার প্রযুক্তিগত ক্ষেত্রে তৈরি করা হয়।

    • একটি enumএকটি ভালো উপায় আপনার মডেল মধ্যে "ভূমিকা" define হয়। সুতরাং Listভূমিকাগুলির একটি ভাল জিনিস।
  • enum স্ট্রিং তুলনায় অনেক উচ্চতর।

    • Role ডোমেনে বিদ্যমান সমস্ত ভূমিকার একটি ঘোষণা।
    • স্ট্রিং "অ্যাডমিন" অক্ষরগুলির সাথে একটি "A" "d" "m" "i" "n"ক্রম। এটি ডোমেন সম্পর্কিত যতদূর নয় is
  • Roleকিছু জীবনের ধারণা দেওয়ার জন্য আপনি যে কোনও ক্লাস ডিজাইন করতে পারেন - কার্যকারিতা - Roleএনামের ভাল ব্যবহার করতে পারে ।

    • উদাহরণস্বরূপ, প্রতিটি ধরণের ভূমিকার জন্য উপ-শ্রেণীর পরিবর্তে, এমন একটি Roleসম্পত্তি রয়েছে যা এই শ্রেণীর উদাহরণটি কী ধরণের তা বলে।
    • একটি User.Rolesতালিকা যুক্তিযুক্ত যখন আমাদের প্রয়োজন হয় না বা না চান, তাত্ক্ষণিক রোল অবজেক্টস।
    • এবং যখন আমাদের কোনও ভূমিকা তাত্ক্ষণিক করার দরকার হয়, তখন এনামটি একটি দ্বি-দ্বি-দ্বিধাবিভক্ত, একটি RoleFactoryশ্রেণীর সাথে যোগাযোগের নিরাপদ উপায় ; এবং, কোড পাঠকের কাছে তুচ্ছ নয়।

3

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

আরও সাধারণ পদ্ধতির মধ্যে রয়েছে একটি একক ব্যবহারকারী স্তর যেমন সিস্টেম, অ্যাডমিন, পাওয়ার ব্যবহারকারী, ব্যবহারকারী ইত্যাদি everything সিস্টেম সবকিছু করতে পারে, বেশিরভাগ জিনিস অ্যাডমিন এবং ডাউন ডাউন down

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

সুতরাং আপনার থাকতে পারে:

Back office role 1
Front office role 2
Warehouse role 4
Systems role 8

সুতরাং যদি কোনও ব্যবহারকারীর 6 টির ভূমিকা থাকে তবে তাদের সামনে ফ্রন্ট অফিস এবং গুদামের ভূমিকা থাকবে।


2

হ্যাশসেটটি ব্যবহার করুন কারণ এটি সদৃশ প্রতিরোধ করে এবং তুলনামূলক আরও পদ্ধতি রয়েছে

নইলে এনুমের ভালো ব্যবহার

বুলিয়ান ইসআইনরোল (রোল আর) একটি পদ্ধতি যুক্ত করুন

এবং আমি সেট এড়িয়ে যেতে হবে

List<Role> roles = new List<Role>();
Public List<Role> Roles { get {return roles;} }

1

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


0

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

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