2011-08-31 56 views
1

我有以下功能:如何重構此邏輯的函數參數:「僅當參數1爲真時才需要參數2」?

public enum class SetMinMaxMode 
{ 
    Auto, // min and max is set based on the channel data 
    Manual 
}; 

generic<typename T> where T : System::ValueType 
void SetData(array<T>^ data) 
{ 
    SetData(data, SetMinMaxMode::Auto, Double::MinValue, Double::MaxValue); 
} 

generic<typename T> where T : System::ValueType 
void SetData(array<T>^ data, SetMinMaxMode minMaxMode, Double minValue, Double maxValue) 
{ 
    // 
} 

參數minValue(最小值)和包括maxValue當參數minMaxMode是SetMinMaxMode ::手冊時才使用。

如果有人這樣寫道功能:

SetData(data, SetMinMaxMode::Auto, desiredMinValue, desiredMaxValue); 

然後,他可能不知道,最後的兩個參數都不會被使用。

我的問題是,有什麼方法可以重構,以便有人永遠不需要提供不必要的參數?

回答

1

你可以編寫一個函數,它根本不需要SetMinMaxMode。

SetDataAuto(data); 

所以你要麼用最小/最大值調用一個,要麼用自動調用那個。

您的其他功能將是:

SetDataManual(data, min, max); 
+0

是,使用不同的功能名稱將是一個解決方案。但是如果你考慮如何實現這兩個函數,仍然需要一個「擴展」函數來獲取所有的參數,比如SetDataCore(data,mode,min,max)。 –

+0

SetDataAuto可以用另外兩個參數調用SetDataManual。 'SetDataAuto(Data){SetDataManual(data,1,2); }' – mydogisbox

+0

對不起,這裏可能會有困惑。 SetDataAuto將根據數據計算最小值和最大值,計算出的最小值和最大值僅在運行時已知。我想我可以做一些像'SetDataAuto(data){double min,max; FindMinMax(data,min,max); SetDataManual(data,min,max); }'。但是如果我真的想要一個**核心**函數來接受所有參數呢? –

相關問題