2013-02-27 226 views
0

最近我已經注意到爲特定實體分配一個id的約定,引起我注意的是如果id不在那裏,則返回-1。爲什麼返回-1而不是0?爲什麼返回-1而不是0?

protected long AcqAgreementID 
{    
    get 
    { 
     if(ViewState["AcqAgreementID"] != null) 
     { 
      return Convert.ToInt64(ViewState["AcqAgreementID"]); 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

+4

在某些情況下,0是一個有效值 – CodesInChaos 2013-02-27 13:21:36

+0

我的問題看起來很蠢,我得到減號。 – 2013-02-27 13:26:45

+0

如果通過返回-1或0你想顯示發生錯誤,你應該繼續使用-1。返回0代替或任何其他值作爲錯誤代碼的意思,你的退出沒有任何錯誤退出。這只是一個古老的最佳做法。 – 2013-02-27 13:30:52

回答

1

通常0是一個有效的id或返回值。想想一個具有索引或搜索字符串的控件。當爲包含多個項目的控件查找選定索引或查找字符串中某個字符的索引時,返回值0是完全正常的。索引0表示選擇的第一個項目或在字符串中的第一個位置找到一個字符。在這兩種情況下,當沒有選擇或找到任何內容時返回-1。

+1

我非常喜歡你的答案。簡單而親切。謝謝兄弟。 – 2013-02-27 15:01:22

6

我期望-1被選擇,因爲值不能被用於一個ID。在這種情況下,它可以用來表示ID是無效的。

這個函數的設計者似乎希望調用者檢查返回值是否是特殊的sentinel值-1。如果返回-1,則調用者需要採取適當的步驟。例如,調用者可能會顯示或記錄錯誤消息。

+0

這同樣適用於具有多種數據庫方案的'0' – CodesInChaos 2013-02-27 13:24:01

+0

@David Heffernan:那爲什麼不是0? – 2013-02-27 13:24:25

+1

@HumayounKabir只有代碼的作者才能回答這個問題。也許0是一個有效的ID。也許不是。即使0無效,-1更明顯是一個不好的值。此外,-1的值經常用於指示無效的數組索引,因此該用例的熟悉程度可能會滲透到這個用例中。 – 2013-02-27 13:25:49

0

在大多數情況下,您都不應該返回。很可能你應該拋出異常。

返回0或-1意味着調用程序必須檢查這個已知的錯誤值,而不是簡單地捕獲異常。

+0

我不同意。我看到兩種情況1)如果應用程序期望非零值,則引發異常就沒有問題。但在這種情況下不應該被捕。 2)調用代碼需要處理缺少的值。在這種情況下,它應該檢查它是否有效。 (也許使用'TryGetAgreementID'方法)。不要對控制流使用異常處理。 – CodesInChaos 2013-02-27 13:27:03

+0

從給出的代碼示例看,這看起來像是一個應用程序異常。 – 2013-02-27 14:23:01

+0

我同意例外不應該用於流量控制 從給出的代碼示例看,這看起來像是應用程序異常。 拋出異常允許您提供更多的上下文和幫助。而不是返回0或-1,拋出一個自定義異常允許你明確說明發生了什麼。您可以拋出一個AcqAgreementIDNotSetExcption來指示ViewState值爲null或AcqAgreementIDWrongFormatException指示從ViewState檢索的值格式錯誤。 也會記錄和跟蹤異常情況。 – 2013-02-27 14:29:22

0

這是一個簡單的情況magic numbers反模式。

不應該這樣做。應使用Consts或定義(取決於語言)。

幻數一般;導致WTF和像你一樣的問題。

+0

如果在無效呼叫的情況下會添加拋出異常的可能性,我會加倍努力。 – 2013-02-27 13:23:47

0

這個問題是有點開放式的,不知何故太籠統;用「取決於」這樣的東西來回答真的很容易。 一般來說,當0是一個完全合法的域值時(例如,它在ID的允許範圍內),您使用負值:

然而,這不是一個好的模式:它會留下函數的用戶/ API困惑(像你)。你必須弄清楚函數返回一個域中的數字(正整數),並且負值是不可能的,因此用作「invalud」值。

在C#/ .NET中,例如您應該考慮可空類型。他們通過添加額外的「值/狀態」(null)來明確地說「這個值不在域中」。 除了可空類型,你應該考慮其他有效的約定是:

  • 拋出一個異常(像Int.Parse)
  • 添加out參數來表示有效性或沒有(像Int.TryParse)
+1

可能會讓自己陷入混亂。我同意你的「取決於」...但是,然後反駁爲「應該使用可爲空」......這又是一個「取決於」。 – 2013-02-27 13:29:39

+0

@MatthewWhited權利,我編輯它「應該考慮」。可空類型和關係數據庫中的NULL之前(爲此目的而發明的)(對於出現錯誤/非初始化條件的情況,具有非域值) – 2013-02-27 13:32:01

+1

@ dema80:此id字段不能是可空的整數它是該實體的主要關鍵領域。 – 2013-02-27 13:32:10

0

我已經使用這種模式在我想爲一個ID使用一個不可爲空的整數值的地方。我不喜歡使用0作爲「default」/「unassigned」ID,因爲它是整數類型的默認值。這允許我查看模型對象,以確定它們是否應該插入或更新,並且我也可以告訴它是否未知「0」。

這取決於你的體系結構,從其他幾個帖子中可以看出,它可以通過可爲空的非可空ID來構建宗教戰爭。

...

作爲一個說明我還看到/使用的模式,其中模型有其用已知的值,如-1 colleased(??)呼叫前進入功能可空類型/數據模型需要非空類型。我們總是參與開發項目,這是「它取決於」的真棒世界。

1

這是在.NET框架中返回索引的方法的標準。

public int FindIndex( Predicate<T> match)方法返回匹配 通過匹配所定義的條件下,如果發現了一個元件的第一次出現的 從零開始的索引;否則,-1。

http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx

這使主叫方可以辦理ID /索引不被發現,他們想要的任何方式。他們可能會拋出異常或從其他來源獲取ID;他們想要什麼。

可空類型本來可以使用,但是這些方法的標準是在引入可空類型之前開發的。如果你可以控制這段代碼,你可以考慮改變它,但是返回-1沒有問題。肯定不會返回0,因爲0通常是一個有效的ID /索引。

相關問題