C# naming convention for enum and matching property

前端 未结 8 1097
鱼传尺愫
鱼传尺愫 2020-12-02 07:03

I often find myself implementing a class maintaining some kind of own status property as an enum: I have a Status enum and ONE Status property of Status type. How should I s

相关标签:
8条回答
  • 2020-12-02 07:30

    The definition of "Off", "Starting" and "Moving" is what i would call a "State". And when you are implying that you are using a "State", it is your "Status". So!

    public class Car
    {
      public enum State
      {
        Off,
        Starting,
        Moving
      };
    
      State state = State.Off;
    
      public State Status
      {
        get { return state ; }
        set { state= value; DoSomething(); }
      }
    }
    

    If we take another example from the one stated where you'd like to use the word "Type" such in this case:

    public class DataReader
    {
        public enum Type
        {
            Sql,
            Oracle,
            OleDb
        }
    
        public Type Type { get; set; } // <===== Won't compile =====
    
    }
    

    You really need to see that there is a difference between enums and enums, right? But when creating a framework or talking about architecture you need to focus on the simillarities, ok lets find them:

    When something is set to a State, it's defined as the "things" Status

    Example: The Car's Status is in Running State, Stopped State, and so on.

    What you want to acheive in the second example is somewhat this:

    myDataReader.Type = DataReader.Database.OleDb
    

    You might think that this says against what i've been preaching about to others, that you need to follow a standard. But, you are following a standard! The Sql-case is a specific case aswell and therefore need a somewhat specific solution.

    However, the enum would be re-usable within your System.Data space, and that's what the patterns is all about.

    Another case to look at with the "Type" is "Animal" where Type defines the Species.

    public class Animal
        {
            public enum Type
            {
                Mammal,
                Reptile,
                JonSkeet
            }
    
            public Type Species{ get; set; }
    
        }
    

    This is following a pattern, you don't specificly need to "know" the Object for this and you are not specifing "AnimalType" or "DataReaderType", you can re-use the enums in your namespace of choice.

    0 讨论(0)
  • 2020-12-02 07:32

    I think the real problem here is that the enum Status is encapsulated within your class, such that Car.Status is ambiguous to both the property Status and the enum Status

    Better yet, put your enum outside of the class:

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

    UPDATE

    Due to the comments below, I'll explain my design above.

    I'm one who doesn't believe that enums or classes or any other object should reside inside another class, unless it will be totally private within that class. Take the above example, for instance:

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

    While some commenters would argue that Status doesn't have any meaning outside the scope of the class Car, the fact that you are setting a public property means that there are other parts of the program that will use that enum:

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

    And that to me is a code smell. If I'm going to look at that status outside of Car, I might as well define it outside as well.

    As such, I will probably just rename it as:

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

    However, if that enum will be used within and only within the car class, then I'm fine with declaring the enum there.

    0 讨论(0)
  • 2020-12-02 07:32

    I suggest adding "Option" to the type name (or Flag if it contains bit flags), i.e. type is Car.StatusOption and property is Car.Status.

    Compared to pluralizing, this avoids naming collisions when creating collections of the enum type, where you would normally want to pluralize the collection property, not the enum type.

    0 讨论(0)
  • 2020-12-02 07:34

    I'd change the name of the property to something like "CurrentStatus". Quick an easy :)

    0 讨论(0)
  • 2020-12-02 07:35

    I usually prefix the enums, e.g. CarStatus. I suppose it all depends on team you're working with (if they have any rules/ processes for that sort of thing) and the objects usage. Just my 2 cents (:

    0 讨论(0)
  • 2020-12-02 07:36

    I know my suggestion goes against the .NET Naming conventions, but I personally prefix enums with 'E' and enum flags with 'F' (similar to how we prefix Interfaces with 'I'). I really do not understand why this is not the convention. Enums/Flags are a special case like Interfaces that will never change their type. Not only does it make it clear what it is, it's very easy to type in intellisense since the prefix will filter most other types/variables/etc, and you won't have these naming clashes.

    And that would also solve another problem where for examples in WPF they use static classes like enums (e.g. FontWeights) that have pre-defined instances of types but you would not know if you don't search for it. If they just prefixed them with 'E', all you would have to do is type on character to find these special static classes.

    0 讨论(0)
提交回复
热议问题