2011-08-31 44 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); }'。但是如果我真的想要一个**核心**函数来接受所有参数呢? –

相关问题