簡體   English   中英

枚舉和匹配屬性的C#命名約定

[英]C# naming convention for enum and matching property

我經常發現自己實現了一個類來維護某種自己的狀態屬性作為枚舉:我有狀態類型的狀態枚舉和狀態屬性。 我該如何解決這個名稱沖突?

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(); }
  }
}

如果Status enum對於不同的類型是通用的,我會把它放在課外,問題就會解決。 但Status僅適用於Car,因此在類外聲明枚舉是沒有意義的。

在這種情況下你使用什么命名約定?

注意:在回答這個問題的評論中,對這個問題進行了部分辯論。 由於這不是主要問題,因此沒有太多可見性。

編輯:Filip Ekberg建議IMO針對“狀態”的具體案例提供出色的解決方法。 然而,我很有興趣閱讀關於枚舉/屬性名稱不同的解決方案,如Michael Prewecki的回答

EDIT2(2010年5月):我最喜歡的解決方案是按照Chris S的建議復數枚舉類型名稱。根據MS指南,這應該僅用於標記枚舉。 但我越來越喜歡它了。 我現在也將它用於常規枚舉。

“關閉”,“開始”和“移動”的定義就是我所說的“國家”。 當你暗示你正在使用“狀態”時,它就是你的“狀態”。 所以!

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

  State state = State.Off;

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

如果我們從你所說的那個中使用“Type”這個詞的另一個例子,在這種情況下:

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

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

}

你真的需要看到枚舉和枚舉之間有區別,對吧? 但是在創建框架或談論架構時,您需要關注相似性,確定可以找到它們:

當某些東西設置為某個狀態時,它被定義為“事物”狀態

示例:Car的狀態處於Running State,Stopped State等狀態。

你想在第二個例子中實現的是某種程度的:

myDataReader.Type = DataReader.Database.OleDb

你可能會認為這反對我一直在向別人講道,你需要遵循一個標准。 但是,你遵循標准! Sql-case也是一個特定的案例,因此需要一些特定的解決方案。

但是,枚舉可以在System.Data空間中重復使用,這就是模式的全部內容。

使用“Type”查看的另一個案例是“Animal”,其中Type定義了Species。

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

        public Type Species{ get; set; }

    }

這是一個模式,你沒有特別需要“知道”對象,你沒有指定“AnimalType”或“DataReaderType”,你可以重新使用你選擇的命名空間中的枚舉。

我會在討論中添加1歐元,但可能不會添加任何新內容。

顯而易見的解決方案是將Status移出嵌套的Enum。 大多數.NET枚舉(除了可能是Windows.Forms命名空間中的一些)都沒有嵌套,這使得使用API​​的開發人員很煩人,必須在類名前加上前綴。

有一件事沒有提到 ,根據MSDN指南的標志枚舉應該你可能已經知道的復數名詞 (狀態是一個簡單的枚舉,所以應該使用單數名詞)。

國家(enum稱為州)是一種稱呼,“狀態”是一個名詞的主格,英語就像我們的大多數語言從拉丁語中吸收。 Vocative是你為其條件命名的名詞,而主格是動詞的主語。

因此,換句話說,當汽車在行駛 ,這是動詞-移動是其狀態。 但是汽車沒有發動,它的引擎確實如此。 也沒有啟動,引擎確實(你可能在這里選了一個例子,所以這可能是無關緊要的)。

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;

實際上,這不會發生,因為它們被實現為驅動程序和繼承鏈而不是使用枚舉,這就是為什么上面的行看起來不自然。

我認為這里真正的問題是枚舉狀態被封裝在你的類中,這樣Car.Status對屬性Status和enum Status Car.Status明確

更好的是,把你的枚舉放在課堂之外:

public enum Status
{
    Off,
    Starting,
    Moving
}

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

UPDATE

由於下面的評論,我將在上面解釋我的設計。

我是一個不相信枚舉或類或任何其他對象應該駐留另一個類中的人,除非它在該類中完全是私有的。 以上面的例子為例:

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

雖然有些評論者認為Status在Car類的范圍之外沒有任何意義,但是你設置公共屬性的事實意味着該程序的其他部分使用該枚舉:

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

對我來說就是代碼味道。 如果我要在Car 之外查看那個狀態,我也可以在外面定義它。

因此,我可能會將其重命名為:

public enum CarStatus
{...}

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

但是,如果該枚舉將汽車類內部使用,那么我可以在那里聲明枚舉。

我知道我的建議違反了.NET命名約定,但我個人在枚舉中加上'E'和enum標志加'F'(類似於我們如何使用'I'作為前綴接口)。 我真的不明白為什么這不是慣例。 枚舉/標志是一種特殊情況,如接口,永遠不會改變它們的類型。 它不僅清楚地說明了它是什么,因為前綴將過濾大多數其他類型/變量/等,因此輸入intellisense非常容易,並且您不會有這些命名沖突。

這也解決了另一個問題,對於WPF中的示例,他們使用靜態類,如枚舉(例如FontWeights),它們具有預定義的類型實例,但您不知道是否不搜索它。 如果他們只是用'E'作為前綴,那么你所要做的就是輸入字符來找到這些特殊的靜態類。

匈牙利符號及其變種的仇恨者應該被詛咒。 我使用后綴枚舉的約定 - 等待它 - Enum 因此,我從來沒有你描述的問題,浪費時間擔心什么叫它們,代碼是可讀的和自描述的引導。

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

  public StatusEnum Status { get; set; }

}

我將屬性的名稱更改為“CurrentStatus”。 快點簡單:)

我建議在類型名稱中添加“Option”(如果它包含位標志,則為Flag),即type為Car.StatusOption,屬性為Car.Status。

與復數相比,這可以避免在創建枚舉類型的集合時命名沖突,您通常希望在其中復數集合屬性 ,而不是枚舉類型

我通常在枚舉前加上前綴,例如CarStatus。 我想這一切都取決於你正在使用的團隊(如果他們有這種事情的任何規則/流程)和對象的使用。 只需2美分(:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM