2017-06-02 50 views
0

我有許多類似的方法具有不同的參數。我試圖找到一個好的和簡單的重構解決方案,但沒有結果。我可以使用一個參數對象,但我想我需要創建另一個輔助類,它會使一切變得更加複雜和慢。如何避免使用不同參數的方法

void Foo(ref int test2) 
{ 
    Goo(test2); 
} 

void Foo(ref long test2) 
{ 
    Goo(test2); 
} 

void Foo(ref double test2) 
{ 
    Goo(test2); 
} 

void Foo(ref string test2) 
{ 
    if (!test2.IsNull()) 
     test2 = "sth"; 
    Goo(test2); 
} 
+0

你在尋找* generics *嗎? 'void Foo (ref T test2)' –

+5

如果你提供一個更復雜的例子,它會有所幫助。我們不知道「Goo」是做什麼的,或者爲什麼你的前三種方法接受'ref'參數,儘管沒有改變它們。 –

回答

3

使用generics

void Foo<T>(ref T test2) 
{ 
    Goo(test2); 
} 
+2

這隻適用於'Goo'是一種通用方法,而不是'Foo'的重載系列。 – Lee

+0

在最後一種情況下,如何進行類型特定的操作(即'!test2.IsNull()')處理? –

2
  1. 多種方法重載不是必須避免或重構是壞事。所以在重構之前請三思。
  2. 你的方法似乎是平等的,但他們不是。請查看Foo方法的字符串參數的實現。如果爲空,則有一個輸入值替換。在通用 implemetation的情況下,應當將案件仍覆蓋在類型檢查
  3. 從你的例子,我看到你有一個嵌套的方法調用,但重新實現accordantelly輸入參數類型。請找出它也許是按目的完成的?這可能是因爲您的代碼是API的一部分,在其他語言中引用的API不具有泛型

如果仍然確信你必須重構它,則可能有以下選項:

  • 通用
  • OOP(polimorfism和虛擬化)輸入參數
  • 使用動態或對象類型(真的很關心拳擊和類型比較)
  • 如果你想減少一定的代碼,你必須保留,但最終的代碼有很多相同的方法的實現對你來說可以,在這種情況下,T 4可以作爲選項
+0

是的,我認爲你是對的。實際上有很多代碼行,但總的來說並不是那麼糟糕。由於這些功能中的其他操作,泛型在我的情況下並不好。我想過對象類型,但這是危險的,可能比最糟糕的還要糟糕。面向對象可以是一個答案,但我必須更多地考慮這種情況。我會在週末後回答問題,也許我會找到很好的解決方案。 –

相關問題