【问题标题】:What is the correct order to validate parameters? [closed]验证参数的正确顺序是什么? [关闭]
【发布时间】:2011-12-08 21:40:01
【问题描述】:

作为参考,我想指出this question 被考虑到如何测试参数。

我们以下面两个sn-ps为例:

public void DoSomething1(Dictionary<string, string> param1, Object param2)
{
    if (null == param1)
        throw new ArgumentNullException("param1");
    if(!param1.Keys.Contains("somekey"))
        throw new ArgumentException("param1 must contain key \"somekey\"");
    if(null == param2)
        throw new ArgumentNullException("param2");

    // now we do some stuff
}

public void DoSomething2(Dictionary<string, string> param1, Object param2)
{
    if (null == param1)
        throw new ArgumentNullException("param1");
    if (null == param2)
        throw new ArgumentNullException("param2");
    if(!param1.Keys.Contains("somekey"))
        throw new ArgumentException("param1 must contain key \"somekey\"");  

    // now we do some stuff
}

这两种方法都会对方法的内部工作实现相同的保护。

我的问题是……

测试传递给方法的参数的正确方法/顺序是什么(例如在本例中)为什么

请引用参考资料来备份您的答案。

【问题讨论】:

  • 我认为没有“正确的方法”。在这种情况下,它看起来确实是一个偏好问题。
  • 正确的方法是有意义的。例如,应首先检查 param1 上的空异常,然后再对其调用 Contains(),就像您在代码示例中所做的那样。
  • 我了解这两项工作;您是否应该在验证 param2 之前完全验证 param1?还是应该在测试中从最简单的异常发展到更复杂的异常?

标签: c# exception-handling theory


【解决方案1】:

没有“正确的顺序”。

它完全是特定于实现的。换句话说,报告参数为空对您来说更重要,还是在获取参数时深入检查参数更重要?

如果我这样做,我会采用“性能”方法。换句话说,我会首先测试所有必要的参数是否为非空,然后我会打开每个参数以确保我得到了我想要的。执行空引用检查比测试字典是否包含键要快(稍微)。

当然,我唯一担心的是这个方法是否注定每秒被调用数百次,并且它有可能被传递空参数。对于影响有限的方法,我会坚持调用者首先需要知道的内容。

【讨论】:

  • 我的观点和你一样。但是,通过所有情况下的性能来建立测试的“最佳实践”是否公平?
  • @davids:不。我们可以做很多事情来编写代码以使其性能更好。但是,高性能代码可能会导致代码可读性降低。从这个角度来看,您必须逐案确定性能是否比可读性更重要。
  • 另一个原因是,以一种方式编写的代码与另一种方式编写的代码的性能差异可能是微不足道的,或者对应用程序的执行影响为零。例如,如果您的示例中的代码最多每小时执行一次,那么以这种方式优化它是零意义的。但是,如果每秒执行数百或数千次,那么高度优化和未优化之间的差异实际上可能会对满足性能目标所需的硬件产生财务影响。这就是为什么常见的最佳做法是仅在必要时进行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2016-05-08
  • 2013-08-18
  • 2020-01-05
  • 1970-01-01
相关资源
最近更新 更多