2010-05-17 31 views
3

我最近開始開始使用功能,使的一個實例我有這樣的事情幫手鑄造功能 - 它是一種代碼味道?

((Dictionary<string,string>)value).Add(foo); 

鑄造我的手指更容易和它轉化爲一個小小的輔助函數,所以我能做到這一點

ToDictionary(value).Add(foo); 

這是代碼味道嗎?

另外,更簡單的例子呢?例如,在我的腳本引擎,我認爲做這樣的

((StringVariable)arg).Value="foo"; 

事情是

ToStringVar(arg).Value="foo"; 

我真的不喜歡怎麼序蒙上了價值,並立即從它那裏得到一個屬性,您必須將其括在雙括號內。我有一種感覺,最後一個是比第一個雖然

(也是我這個標記語言無關的,即使我舉的例子是C#)

+0

*嗅出嗅出*聞起來像肉桂,丁香的暗示。一個相當愉快的花束。 :) 這並沒有那麼糟糕,但也許你可能想在方法中包含'Add':AddToDictionary(value,foo);'(如果這就是你如何使用它的話)。 – FrustratedWithFormsDesigner 2010-05-17 17:41:40

+1

這是Generics表面上應該修復的代碼味道。 我有興趣知道爲什麼你不知道你有一個字符串 - >字符串映射分配給代碼中的'值'變量? 如果答案是「因爲一些我無法控制/影響的人寫了一個返回模糊類型的模塊函數。」在這種情況下,我做了兩件事。 1)繼續努力研究'某個人'和他的代碼,2)我在分配時爲數據類型排除歧義。在我的方法或獲取值的代碼塊的頂部,我聲明瞭一個Dictionary 併爲其賦值'value'。 – Jason 2010-05-17 17:44:09

+0

@Jason這真的是不可避免的。那只是一個例子。看到我的第二個例子(這是真實的)。儘管你可能應該做的第二件事情,但它並不總是這樣,因爲這個函數傳入一個BaseVariable,有時它需要被轉換爲一個IntegerVariable或StringVariable。這就是腳本引擎目前的工作方式。 – Earlz 2010-05-17 17:48:04

回答

4

暫時忽略你可能真的需要做這個演員 - 我個人懷疑 - 如果你真的只想「保存你的手指」,你可以使用using聲明縮短你的泛型類型的名稱。

在你的文件的頂部,與所有其他usings:

using ShorterType = Dictionary<string, Dictionary<int, List<Dictionary<OtherType, ThisIsRidiculous>>>>; 
+0

我真的有過3級深層嵌套的泛型。這真是太神奇了,不知道'使用'可以用於那個! – Earlz 2010-05-17 18:02:23

+0

這是一個可靠的解決方案,但不是OP所期望的語言不可知的。 – 2010-05-17 19:01:40

+0

如果您希望語言不可知,您可以在這裏使用標稱類型進行調查。這就是你創建一個新的類,它重新使用基類的實現,但僅在語義上有所不同。如果我在任何地方傳遞如此複雜的地圖,它可能是我數據模型的一個組成部分。如果我不給它起一個名字,誰會責怪?我會給你一個提示:不是那個首先提出通用方法的人。 – Jason 2010-05-17 19:44:22

1

我不這麼認爲更糟。你也做了一些很好的事情,閱讀和看看發生了什麼更容易一些。 Glib(用C語言)爲他們的類提供了鑄造宏,所以這不是一個新概念。只是不要試圖挽救你的手指。

0

一般來說,我會認爲這是代碼味道。在大多數情況下,您所描述的類型轉換是必要的,除了泛型/模板之外,您還可以通過正確使用接口(Java)或虛擬繼承(C++)來獲得相同的行爲。將類型管理職責留給編譯器比自己試圖管理它要安全得多。

沒有額外的上下文,很難說你包含的例子。當然有些情況下你所描述的鑄造類型是不可避免的。但他們是例外而非規則。例如,在通用C庫中,您所描述的類型轉換(以及相關的輔助函數/宏)非常常見。