এন # এবং মিলের সম্পত্তি জন্য সি # নামকরণের সম্মেলন


94

আমি প্রায়শই নিজেকে এনাম হিসাবে কোনও ধরণের নিজস্ব স্ট্যাটাসের সম্পত্তি বজায় রাখার জন্য একটি শ্রেণি বাস্তবায়ন করতে দেখি: আমার কাছে স্ট্যাটাস এনাম এবং স্থিতির ধরণের এক স্ট্যাটাস সম্পত্তি রয়েছে। এই নামের দ্বন্দ্ব কীভাবে সমাধান করব?

public class Car
{
  public enum Status
  {
    Off,
    Starting,
    Moving
  };

  Status status = Status.Off;

  public Status Status // <===== Won't compile =====
  {
    get { return status; }
    set { status = value; DoSomething(); }
  }
}

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

এই ক্ষেত্রে আপনি কোন নামকরণের কনভেনশন ব্যবহার করেন?

বিশেষ দ্রষ্টব্য: এই প্রশ্নের আংশিকভাবে এর একটি উত্তর মন্তব্য বিতর্ক হয়েছিল এই প্রশ্নের । যেহেতু এটি মূল প্রশ্ন নয়, এটি খুব বেশি দৃশ্যমানতা পায়নি।

সম্পাদনা: ফিলিপ একবার্গ 'স্ট্যাটাস'-এর নির্দিষ্ট ক্ষেত্রে আইএমওর দুর্দান্ত কাজের প্রস্তাব দেয়। তবুও আমি মাইল প্রেভেকির উত্তরের মতো এনাম / সম্পত্তির নাম আলাদা হওয়ার মতো সমাধানগুলি সম্পর্কে জানতে আগ্রহী হব ।

সম্পাদনা 2 (মে 2010): আমার প্রিয় সমাধানটি হ'ল এনাম টাইপের নাম বহুবচন করা, যেমন ক্রিস এস পরামর্শ দিয়েছিলেন, এমএসের নির্দেশিকা অনুসারে, এটি কেবল পতাকা এনামগুলিতে ব্যবহার করা উচিত। তবে আমি এটিকে আরও বেশি করে পছন্দ করতে এসেছি। আমি এখন এটি নিয়মিত এনামগুলিতেও ব্যবহার করি।


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

উত্তর:


32

আমি আলোচনায় আমার 1 ইউরো যুক্ত করব তবে এটি সম্ভবত নতুন কিছু যুক্ত করছে না।

সুস্পষ্ট সমাধান হ'ল স্ট্যাটাসটিকে নেস্টেড এনাম থেকে দূরে সরিয়ে নেওয়া। বেশিরভাগ নেট নেট এনাম (সম্ভবত উইন্ডোজ Forফর্মস নেমস্পেসের কিছু বাদে) বাসা বাঁধে না এবং এটি বিকাশকারীদের আপনার এপিআই গ্রাস করে ক্লাসের নামটি উপস্থাপন করার জন্য ব্যবহার করা বিরক্তিকর করে তোলে।

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

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

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

public class Car
{
  VehicleState _vehicleState= VehicleState.Stationary;

  public VehicleState VehicleState 
  {
    get { return _vehicleState; }
    set { _vehicleState = value; DoSomething(); }
  }
}

public enum VehicleState
{
    Stationary, Idle, Moving
}

রাজ্য যেমন একটি সাধারণীকরণ বিশেষ্য এটি কোন রাষ্ট্রের উল্লেখ করছে তা বর্ণনা করা ভাল না? আমি উপরোক্ত মত

আমার দৃষ্টিতে টাইপ উদাহরণটি পাঠক প্রকারের উল্লেখ করে না, তবে এটির ডাটাবেস। আমি যদি আপনি পাঠকের ডাটাবেস পণ্যটি বর্ণনা করে যা পাঠকের প্রকারের সাথে প্রাসঙ্গিকভাবে প্রাসঙ্গিক না হয় (যেমন পাঠকের ধরণটি কেবল এগিয়ে, ক্যাশেড ইত্যাদি হতে পারে) বর্ণনা দিচ্ছিলাম তবে আমি এটিকে পছন্দ করব। তাই

reader.Database = Databases.Oracle;

বাস্তবে এটি কখনই ঘটে না কারণ তারা চালক হিসাবে প্রয়োগ করা হয় এবং এনাম ব্যবহারের পরিবর্তে উত্তরাধিকার শৃঙ্খলা থাকে যার কারণে উপরের লাইনটি স্বাভাবিক দেখাচ্ছে না doesn't


24
আমার বোঝা হ'ল পতাকাগুলি বহুবচন করা উচিত, সহজ এনামগুলিতে নয়।
সার্জ ওটিয়ার 13

9
এনামগুলিকে ক্লাসের বাইরে নিয়ে যাওয়া সম্পর্কে, এখনও বুঝতে পারি নি কার্টস্টেট কার.স্টেটের চেয়ে আরও সুবিধাজনক কেন। তবে, যখন এই এনাম কেবল এই শ্রেণীর আচরণের বর্ণনা দেয় তখন কোনও শ্রেণীর বাইরে এনাম পাওয়ার ইতিবাচক দিকটি আমি বুঝতে পারি না।
সার্জ ওয়াটিয়ার

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

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

4
আমি জানি আমি এখানে 1/2 বছর দেরি করছি, তবে উদাহরণে public class EngineStateথাকা উচিত public enum EngineState, তাই না?
ডেভিড মারডোক

36

"অফ", "স্টার্টিং" এবং "মুভিং" এর সংজ্ঞাটি হ'ল আমি "রাষ্ট্র" বলব। এবং যখন আপনি বোঝাচ্ছেন যে আপনি "স্টেট" ব্যবহার করছেন, এটি আপনার "স্থিতি"। তাই!

public class Car
{
  public enum State
  {
    Off,
    Starting,
    Moving
  };

  State state = State.Off;

  public State Status
  {
    get { return state ; }
    set { state= value; DoSomething(); }
  }
}

আপনি যদি এই ক্ষেত্রে "টাইপ" শব্দটি ব্যবহার করতে চান সেখানে বর্ণিত ব্যক্তির থেকে আমরা যদি অন্য উদাহরণ গ্রহণ করি:

public class DataReader
{
    public enum Type
    {
        Sql,
        Oracle,
        OleDb
    }

    public Type Type { get; set; } // <===== Won't compile =====

}

আপনার সত্যিই এটি দেখতে হবে যে enums এবং enums মধ্যে পার্থক্য আছে, তাই না? তবে কোনও কাঠামো তৈরি করার সময় বা আর্কিটেকচার সম্পর্কে কথা বলার সময় আপনাকে সাদৃশ্যগুলিতে মনোনিবেশ করা উচিত, ঠিক আছে সেগুলি সন্ধান করুন:

কোনও কিছু যখন কোনও রাজ্যে সেট করা থাকে তখন এটিকে "জিনিস" স্থিতি হিসাবে সংজ্ঞায়িত করা হয়

উদাহরণ: গাড়ির স্থিতি চলমান রাজ্যে, স্টপড স্টেট এবং এ জাতীয়।

দ্বিতীয় উদাহরণে আপনি যা অর্জন করতে চান তা হ'ল কিছুটা:

myDataReader.Type = DataReader.Database.OleDb

আপনি ভাবতে পারেন যে এটি অন্যের কাছে প্রচার করার বিষয়ে যা বলেছে তার বিপরীতে, যে আপনাকে একটি মান অনুসরণ করা দরকার। তবে, আপনি একটি মান অনুসরণ করছেন! SQL-কেস একটি নির্দিষ্ট কেস এবং পাশাপাশি কিছুটা নির্দিষ্ট সমাধানের প্রয়োজন।

যাইহোক, এনামগুলি আপনার System.Dataস্থানের মধ্যে পুনরায় ব্যবহারযোগ্য হবে এবং নিদর্শনগুলি এটাই।

"টাইপ" এর সাথে দেখার আরেকটি কেস হ'ল "প্রাণী" যেখানে প্রজাতিগুলি প্রজাতির সংজ্ঞা দেয়।

public class Animal
    {
        public enum Type
        {
            Mammal,
            Reptile,
            JonSkeet
        }

        public Type Species{ get; set; }

    }

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


4
আমি বিশ্বাস করি "স্থিতি" নামটি কেবল একটি উদাহরণ ছিল। অন্যান্য পরিস্থিতি সম্পর্কে কী, যখন আপনি স্থিতি / রাজ্যের উপর নির্ভর করতে পারবেন না? যেমন একটি টাইপ এনুম ...
ড্যান সি।

4
@ ফিলিপ: অ্যানিমাল টাইপের নমুনাটি প্রথম মন্তব্যে আমি কী বোঝাতে চাইছিলাম তা বোঝায়, অর্থাত এটি এনামের বেশ "পুনর্নির্মাণ"। এনাম এবং সম্পত্তির নামের প্রতিশব্দ ব্যবহার করে কোডটি কিছুটা বিভ্রান্ত হয়, আমার ধারণা।
ড্যান সি

4
আমি আরও মনে করি যে 'প্রজাতি' কেবলমাত্র টাইপের পুনরায় রেকর্ডিং (এই ক্ষেত্রে প্রাণীদের জন্য)।
কিংবদন্তি লেন্থথ

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

4
এই পদ্ধতির ফলে ভুল বোঝাবুঝি হয় এবং কোডটি বিভ্রান্ত হয়
বুগিয়ার

9

আমার মনে হয় এখানে আসল সমস্যাটি হ'ল এনাম স্ট্যাটাসটি আপনার ক্লাসের মধ্যে আবদ্ধ, যেমন Car.Statusসম্পত্তি Statusএবং এনাম উভয়ের জন্যই অস্পষ্টStatus

আরও ভাল, আপনার এনাম ক্লাসের বাইরে রাখুন:

public enum Status
{
    Off,
    Starting,
    Moving
}

public class Car
{
    public Status Status
    { ... }
}

হালনাগাদ

নীচের মন্তব্যের কারণে, আমি আমার নকশা উপরে ব্যাখ্যা করব।

আমিই বিশ্বাস করে না যে enums বা শ্রেণীর বা অন্য কোন বস্তু রক্ষিত উচিত আছি ভিতরে অন্য বর্গ, যদি না তা যে বর্গ মধ্যে সম্পূর্ণভাবে ব্যক্তিগত হবে। উপরের উদাহরণটি ধরুন, উদাহরণস্বরূপ:

public class Car
{
    public enum Status
    {...}
    ...
    public Status CarStatus { get; set;}
}

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

public Car myCar = new Car();
myCar.CarStatus = Car.Status.Off;

এবং এটি আমার কাছে একটি কোড গন্ধ। আমি যে অবস্থা তাকান যাচ্ছি তাহলে বাহিরে এর Car, আমি ভাল হিসাবে এটি সংজ্ঞায়িত পারে বাহিরে হিসাবে ভাল।

এর মতো, আমি সম্ভবত এটির নামকরণ করব:

public enum CarStatus
{...}

public class Car
{
    ...
    public CarStatus Status { get; set; }
}

যাইহোক, যদি সেই এনামটি কেবলমাত্র গাড়ী শ্রেণীর মধ্যে এবং কেবলমাত্র ব্যবহৃত হয় তবে আমি এনামটি সেখানে ঘোষণা করার সাথে ভাল আছি।


এটি স্থিতি বৈশ্বিক করে তুলবে, আপনি এটি কেবল একটি নির্দিষ্ট অঞ্চলের মধ্যে রাখতে চান। "স্ট্যাটাস" যেমন অন্য ধরণের যেমন "মানব" এর "স্টার্টিং" নাও থাকতে পারে। তবে আপনার একটি প্যাটার্ন অনুসরণ করা উচিত।
ফিলিপ একবার্গ

না সে স্পট করছে। এনাম হ'ল 99% ক্ষেত্রে একই শব্দটি আপনি সম্পত্তির জন্য ব্যবহার করতে চান। একটি এনাম কেবল একটি নামযুক্ত পতাকা তাই এটি বাইরে থাকার ক্ষেত্রে কিছুটা ক্ষতি করে না (ক্লাসগুলির তুলনায় যা যুক্তিযুক্ত রয়েছে)
কুইবলসোম

জন, এটি আমার বক্তব্য: স্ট্যাটাস এনামটি কেবল গাড়ী সম্পর্কিত in সম্পূর্ণরূপে বিভিন্ন ধরণের অবজেক্টগুলির সম্পূর্ণ ভিন্ন স্ট্যাটাস থাকবে
সার্জ ওয়াটিয়ার

যদিও তারা বিভিন্ন নামের জায়গাগুলিতে থাকবে, তাই এটি কোনও ব্যাপার নয়
ক্রিস এস

গাড়ির বাইরের দিকে এটি দেখতে চাইলে তা বোঝা যায়। তবে আমার ক্ষেত্রে আমার দুটি ক্লাস রয়েছে, ORএবং CR। উভয়েরই নিজস্ব রাজ্যগুলির সেট রয়েছে, সুতরাং তাদের নিজস্ব ক্ষেত্রের বাইরে তাদের সংজ্ঞা দেওয়ার বিকল্প নয় an
deed02392

4

আমি জানি আমার পরামর্শ .NET নামকরণের কনভেনশনগুলির বিরুদ্ধে রয়েছে, তবে আমি ব্যক্তিগতভাবে 'E' এর সাথে enums উপস্থাপন করি এবং 'F' দিয়ে পতাকাগুলি এনাম করি ('I' এর সাথে আমরা কীভাবে ইন্টারফেস উপসর্গ করি তার অনুরূপ)। আমি কেন বুঝতে পারছি না কেন এটি কনভেনশন নয়। এনামস / ফ্ল্যাগগুলি ইন্টারফেসগুলির মতো একটি বিশেষ কেস যা তাদের ধরণটি কখনই বদলাবে না। এটি কেবল এটি স্পষ্ট করে তোলে না এটি ইন্টেলিজেন্স টাইপ করা খুব সহজ, যেহেতু উপসর্গটি বেশিরভাগ অন্যান্য প্রকার / ভেরিয়েবল / ইত্যাদি ফিল্টার করবে এবং আপনার নামকরণের এই সংঘাত থাকবে না।

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


4

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

public class Car
{
  public enum StatusEnum
  {
    Off,
    Starting,
    Moving
  };

  public StatusEnum Status { get; set; }

}

9
মাইক্রোসফ্টের নামকরণের তালিকাভুক্তির কনভেনশনগুলি যদিও জানাচ্ছে যে দয়া করে সচেতন হন : এক্স এনম টাইপের নামে একটি "এনাম" প্রত্যয় ব্যবহার
ডেভিডআরআর

4
কারণ মাইক্রোসফ্টের সম্মেলনগুলি সময়ের পরীক্ষায় দাঁড়ানোর পক্ষে প্রমাণিত হয়েছে।
নাথানছেরে

2

আমি সম্পত্তিটির নাম "কারেন্টস্ট্যাটাস" এর মতো কিছুতে পরিবর্তন করব। দ্রুত একটি সহজ :)


1

আমি প্রকারের নামটিতে "অপশন" যুক্ত করার পরামর্শ দিই (বা এটিতে বিট ফ্ল্যাগ রয়েছে তবে ফ্ল্যাগ করুন), অর্থাৎ প্রকারটি Car.StatusOption এবং সম্পত্তি Car.Status।

বহুবচনকরণের তুলনায়, এনাম ধরণের সংগ্রহ তৈরি করার সময় এটি সংঘর্ষের নামকরণ এড়ায়, যেখানে আপনি সাধারণত সংগ্রহের সম্পত্তিটি বহুবচন করতে চান , এনাম ধরণের নয়


0

আমি সাধারণত enums উপসর্গ, যেমন CarStatus। আমি মনে করি এগুলি সমস্তই আপনি যে দলের সাথে কাজ করছেন তার উপর (যদি সেই ধরণের জিনিসটির কোনও নিয়ম / প্রক্রিয়া থাকে) এবং অবজেক্টের ব্যবহারের উপর নির্ভর করে। শুধু আমার 2 সেন্ট (:


4
এটি আসলে মাইওবজেক্টনামের স্থিতির সম্মুখভাগ থাকা নামকরণের সম্মেলনটিকে হত্যা করবে।
ফিলিপ একবার্গ 10

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