2012-06-26 86 views
6

我正在開發一個外部API。我添加了一個方法,我的公共接口:僅因爲Null而更改名稱?

public void AddMode(TypeA mode); 
public void AddMode(TypeB mode); // the new method, TypeB and TypeA are not related at all 

它看起來很不錯,直到一個測試打破了被傳遞null。這使編譯器對模糊的調用感到困惑。我通過投射null來修復測試。

但我的問題是:

  • 我應該改名字的,只是因爲這個?
  • 或者應該讓客戶像我一樣進行演員? (如果它們由於某種原因而無效)

在設計API時,這種情況下最好的是什麼?

編輯

呼叫是這樣AddMode(空),不喜歡:

TypeA vl = null; 
AddMode(v1); // this doesn't cause a problem 
+1

類似的問題在這裏[傳遞null](http://stackoverflow.com/questions/719546/c-passing-null-to-overloaded-method-which-method-is-called)和演員建議(一個優秀回答) – V4Vendetta

+0

@MBen - 我建議改變方法的名稱。 – adatapost

+0

@ V4Vendetta我在發佈之前看到:-)。不過,我想知道API的可用性,如果我應該讓客戶端可能會陷入這個。我不明白他們爲什麼會用null調用這些方法,但誰知道:-) – MBen

回答

6

一個API的設計應該很容易正確使用,很難正確使用。 你的API易於正確使用:

AddMode(new TypeA()); 

並編譯。

這是很難正確使用方法:

AddMode(null); 

不能編譯。用戶不得不去做類似於

AddMode((TypeA)null); 

這應該讓他覺得,這是否是預期的使用情況。所以我認爲你的API是可以的。

+0

我喜歡這個。我從這個角度看沒有看到它。 – MBen

1

我認爲這取決於如何特殊null的價值,爲各自的說法是。

比較,例如,this ArgumentNullException constructor:當需要設置內部異常時,最頻繁調用它。否則,傳遞this constructor(除了非法參數的名稱)。奇怪的情況下,前者必須被調用,因爲必須提供自定義消息,但沒有提供內部異常(我通常在爲包含null的數組/集合參數拋出異常時執行此操作,但不是null本身)。所以,在這種情況下,我需要明確的演員陣容,而且我認爲那是可以接受的。

如果你的方法確實相同,但null仍然是一個平常值,你可能需要添加一個參數的過載爲null變異(即顯式類型轉換仍然是可能的,但用戶也可以調用參數的過載,而不是)。

如果你的方法做一些事情有些不同,可是別的東西null,你可以想想幹脆不允許null的方法,你已經證明,增加了null情況下,一個參數的過載。

更新:如果無論如何null是不可接受的(並且會導致異常),那麼您應該保持原樣。除了測試目的之外,不應有任何文字null傳遞給方法的情況,因爲這總會產生一個例外。因此,在這種情況下不要更改超載名稱。

+0

但null是不可接受的,我在這兩種方法中都拋出了一個ArgumentNullException。然而,我看到的錯誤是在編譯時,像這樣Addmode傳遞null(空) – MBen

+0

檢查我的編輯更好的解釋 – MBen

+0

@MBen:我已經更新了我的答案,以考慮到這一點。 –

0

無論如何是否爲這個方法的空有效輸入?

就我個人而言,只要AddMode的兩個重載都相關,因爲您希望AddMode(X)和AddMode(Y)互相做相關的事情。

如果他們沒有任何關係,那麼也許一個方法名稱的變化是爲了

0

嗯,這取決於要麼null你的API中接受值。

如果不只是不接受它,不支持它。所以即使消費者將嘗試null一起使用它,編譯器將打破歧義問題。

+0

那麼null是不可接受的,但錯誤是在編譯時。 – MBen

+0

@MBen:你不希望這是編譯時間? – Tigran

+0

嗨@Tigran請檢查我的更新。 – MBen

0

如果您的API接受null作爲可能的參數值,那麼您必須在文檔中指定它,並提到有必要對其進行強制轉換,並編寫一些代碼示例以顯示方式。但是,如果您不希望用戶使用空值,那麼如果您的類設計允許,則可以將TypeA和TypeB更改爲struct而不是class