做一些研究,似乎人们普遍同意公共方法的参数应该被验证,而私有函数通常不需要。这让我产生了一些疑问,但到目前为止我还没有找到满意的答案。
例子:
public void DoSomething(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
想法:
如果
i
内部非负的要求发生变化DoWork()
怎么办?设计存在留下过时的验证检查的风险。程序员负责调整已更改函数的使用,我知道,但这让我想知道是否有更好的方法来最小化错误风险。不同的电话
DoWork()
not fromDoSomething()
怎么样?我们必须冗余地验证这些论点吗?
public void DoSomething(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
public void DoSomethingElse()
{
int i = 5;
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double d = DoWork(i);
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
这可以通过将检查放入它自己的函数中来稍微清理一下。然后存在调用的新函数DoWork(int i)
会忘记 validate的风险i
。
public void DoSomething(int i)
{
ThrowIfIntegerIsNegative(i);
double d = DoWork(i);
}
public void DoSomethingElse()
{
int i = 5;
ThrowIfIntegerIsNegative(i);
double d = DoWork(i);
}
static void ThrowIfIntegerIsNegative(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
}
private double DoWork(int i)
{
double ret = ...; // some calculation
return ret;
}
那比这更好吗?
public void DoSomething(int i)
{
double d = DoWork(i);
}
public void DoSomethingElse()
{
double d = DoWork(5);
}
private double DoWork(int i)
{
if (i < 0)
throw new ArgumentOutOfRangeException("i");
double ret = ...; // some calculation
return ret;
}
根据情况,这些是我试图同时实现的一些目标:
- 将参数验证放在一个地方(可能在使用参数的函数内部)
- 尽早报告错误(可能不想让一堆代码运行一个小时,最终因为一些错误的用户输入而失败)
- 避免多次验证参数
- 避免发布代码中的性能影响
你如何取得平衡?哪种方法最适合您?我将不胜感激任何见解。