Function 何时检查功能/方法参数?

Function 何时检查功能/方法参数?,function,methods,Function,Methods,在编写小函数时,我经常遇到这样的情况,即某些参数被赋予一个函数,而该函数本身只将这些参数传递给不同的小函数以达到其目的 例如(C#-ish语法): 因此,参数不是在被调用函数内部使用的,而是在执行该任务的小函数的“某个地方” 那么什么时候最好检查我的param对象是否为null 签入功能时: 赞成者: -通过使用进一步的方法不会产生任何开销,因为对象为null,所以这些方法最终不会起任何作用 反对: -我语法上奇妙的函数被丑陋的验证代码弄脏了 仅在使用参数对象时进行检查时: 赞成者: -我奇妙的

在编写小函数时,我经常遇到这样的情况,即某些参数被赋予一个函数,而该函数本身只将这些参数传递给不同的小函数以达到其目的

例如(C#-ish语法):

因此,参数不是在被调用函数内部使用的,而是在执行该任务的小函数的“某个地方”

那么什么时候最好检查我的param对象是否为null

签入功能时:

赞成者: -通过使用进一步的方法不会产生任何开销,因为对象为null,所以这些方法最终不会起任何作用

反对: -我语法上奇妙的函数被丑陋的验证代码弄脏了

仅在使用参数对象时进行检查时:

赞成者: -我奇妙的语法功能让我读起来很愉快:)

缺点: -由于param对象为null,因此调用方法时会产生开销,而这些方法不会执行任何操作。
-进一步的缺点我现在不考虑。

除非您认为该值在绝大多数情况下可能为空,否则我会将验证放在DoD()中。如果将其放在function()中,则在以后决定FunctionB()也需要使用DoD()时,必须重复验证代码。对我来说,额外的开销是值得的,我不必重复。

总是尽可能地将其放在调用堆栈的最下面,这样,如果您以后重构代码和其他调用DoD而不是DoA的东西,您就可以进行检查,而不必重新进行参数检查。在大多数情况下,一个小的空检查和几个额外的方法调用的开销将是微不足道的,额外检查几次并不值得担心。

作为指导原则,我习惯于检查该方法使用的每个参数,甚至包括我自己的私有变量。因此,我只检查国防部方法中的零

您可能想看看Bertrand Meyers的咒语。

始终检查所有内容:)来自嵌入式系统编码库的深层次,这是我使用的方法:

public void FunctionA(object param)
{
    assert(param != null && param.canDoX());
    DoA(param);
    DoB(param);
    DoC(param);
    // etc.
}

private void DoA(object param)
{
    assert(param != null && param.canDoX());
    DoD(param);
}

private void DoD(object param)
{
    assert(param != null && param.canDoX());
    if ( param != null )
        param.DoX();
    else
        // Signal error, for instance by throwing a runtime exception
        // This error-handling is then verified by a unit test that 
        // uses a release build of the code.
}

为了消除这种混乱,显而易见的解决方案是将验证分离到一个单独的验证器函数。使用C风格的预处理器,或者仅仅坚持断言,从发布版本中排除这种“偏执”的验证应该很简单。

早期失败。除非部分结果比完全没有结果更好,否则只要代码检测到有问题,执行就应该停止。当下游的结果将是无效或缺少参数时,为什么代码要运行多个方法


如果可以单独调用下游方法,那么可以通过调用ca common validation Method来处理验证,正如已经建议的那样。

调用方负责传递有效参数。在这种情况下:

if(param != null)
{
  FunctionA(param);
}

大多数情况下都是绝对正确的。如果您确实有耗时的操作,最终可能会失败,那么您可以尝试避免调用DoA,DoB知道DoC会失败(因为DoD)。但这已经是优化了,我仍然会在DoD中有一个签入函数,但也有一个签入函数。这被称为curry函数——不过有点过于简化了。
if(param != null)
{
  FunctionA(param);
}