2012-08-08 54 views
3

這是一個非常簡單的問題,但我真的很想知道什麼是好的做法。擁有單一值的枚舉是合適的嗎?

我有一個包含日誌子系統的系統。日誌包含有關用戶標識的信息。簡化日誌記錄如下:

log.RegisterEvent(eventType, userID, eventDetails); 

某些事件是系統事件,它們沒有關聯用戶ID。由於用戶ID是正整數,我認爲0表示事件不reffer用戶:

log.RegisterEvent(eventType, 0, eventDetails); 

但把0也只是...不正確的。我想用枚舉,如:

enum UserID 
{ 
    None = 0 
} 

但它是確定有一個枚舉只有一個值? 最好使用一個靜態常量? 或者這是更好的方法?

+0

我懷疑這歸結爲編碼風格。我個人建立了一個常數。尤其是,自從傳入一個枚舉時,否則使用整數似乎比具有一個值的枚舉更加噁心。 – Chris 2012-08-08 09:56:19

+3

也許你的userID可能是可以爲空的類型'int?',然後你就不需要這個枚舉了? – 2012-08-08 09:58:28

+0

@Jeppe Stig Nielsen:可空類型int的漂亮ideea。它集成相當不錯,最終將日誌添加到數據庫,其中UserID列是可以爲空和int?作爲一種類型。 – 2012-08-08 11:09:39

回答

3

我不喜歡你的枚舉,因爲大多數開發人員不會期望使用(UserIDEnum)42,因爲它不是枚舉類型的「已定義」值。

此外,「魔術」常數的想法對我來說並不是很吸引人。

對於可空類型,這似乎是一個明顯的例子,即int?(也稱爲Nullable<int>)。大多數開發人員都會明白,如果int?爲空(HasValue爲false),則表示沒有用戶標識,如果爲42,則表示用戶標識。

因此,將第二個參數更改爲int?。和電話將看起來像這樣:

log.RegisterEvent(eventType, null, eventDetails); // no user ID in this case 
log.RegisterEvent(eventType, userID, eventDetails); // variable userID is automatically "lifted" from int to Nullable<int> 
+0

我接受了這個答案,因爲這是我最終在我的代碼中使用的方式。 Jon Skeet和Martin Liversage給出了相當不錯的答案。但使用可空int?與來自SQL的類型(用於日誌記錄)集成。 – 2012-08-17 09:21:39

0

是什麼用途是一個枚舉,當沒有多樣性在那裏。

5

最好使用一個常量 - 否則在使用時必須使用枚舉值,因爲API真的需要一個數字。枚舉是用於封閉的值集合,用戶標識不屬於這個類別。

8

「用戶名」聽起來不像是我自然的一種枚舉。這不像是全球範圍內的自然界有限的用戶。

的常數值,會更有意義:

const long UnknownUserId = 0; 

箱子其中有一個值的枚舉會是有意義的,但它幾乎總是成爲未來expansoin。

+0

想知道更多關於具有單一值的枚舉有意義的情況。 – Gulshan 2016-12-30 08:18:27

+0

@Gulshan:正如我所說的,主要是爲了將來的擴展 - 如果你有一些現在只有一個選項可用,但你想設計你的API將來可能有更多的可用。 – 2016-12-30 08:32:21

+0

它們可以用作自定義文字類型嗎?就像打字稿中的描述一樣? https://github.com/Microsoft/TypeScript/pull/10676 對不起,如果我脫離主題。 – Gulshan 2016-12-30 08:50:21

1

聲明一個用戶變量作爲靜態常量:

static const int NoneUserID = 0; 
+2

consts是隱式靜態的 – 2012-08-08 09:58:39

1

更改日誌記錄子系統,以限定一個過載不帶任何用戶ID。

在那個過載中,你可以編寫一個0,因爲它現在是它將被使用的唯一地方。