2011-12-28 27 views
0

最佳实践是什么?检查条件时调用函数的最佳做法

function A() { 

    if (someClassValue > 0) { 
     B(); 
    } 

} 

function B() { 

    ...do smth, you expect (someClassValue > 0)... 
} 

这里的编码器可能会忘记调用之前检查的条件,并运行系统unconsistent ... 但是从逻辑上来看,主叫用户呼叫的功能,因此他应该负责的条件下,调用函数时,在另一方面,它容易出错

function A() { 

    B(); 

} 

function B() { 

    if (someClassValue > 0) { 
     return; 
    } 

    ...do smth... 
} 

这可能与体内一个

的观点missleading

function A() { 

    if (someClassValue > 0) { 
     B(); 
    } 

} 

function B() { 

    if (someClassValue > 0) { 
     return; 
    } 

    ...do smth... 
} 

这是不必要的双重检查

什么是正确的做法?功能应检查要执行的条件,或者调用此功能的功能是否应检查呼叫的条件B

+1

没有错误或正确的方法。在性能和防弹代码之间进行折衷始终是一种折衷。 – 2011-12-28 16:48:37

回答

4

规则:总是在所有公开的函数中验证参数。

推论:没有必要验证任何非公开的函数中的参数。这通常具有一些边际性能优势,但它也使代码保持清洁并且易于阅读,特别是如果您遵循其他良好的设计模式并且将面向公众的函数调用到合并的私有函数中以执行实际工作。

如果和只有如果性能分析告诉您参数验证是您的应用程序中的一个重要瓶颈,那么您应该关注最小化影响点并将它们排除在非绝对必要的地方。或者,您可以将它们留在调试版本中,并将它们移除以进行版本构建,尽可能减少性能影响,同时仍能够履行其基本目的,即完整性检查。但我必须说,我从来没有见过一个参数验证是瓶颈的应用程序...

至于你上面的问题(我已经方便地忽略),它真的无所谓你选择哪种风格,只要你遵循上述规则。与标记为的问题通常情况一样,最重要的是选择一种风格并坚持-长期以来,一致性是真正的赢家。

+0

说的确的确如此。 +1 – 2011-12-28 16:51:53

+0

好,公众应该总是控制......但公众的来电者呢?他是否应该认为这个功能总是安全的?什么是私人的最佳做法?在一个函数中不验证,因为它的私人看起来不正确 – 2011-12-28 17:02:50

+0

@彼得你是什么意思_“公众的调用者”_谁是调用者 - 更多的是你自己的代码或其他人的代码哪些消耗你的功能? – 2011-12-28 18:31:47

0

#2。你不能认为每个调用函数都会正确地执行检查。

+0

这就是为什么你有黑盒测试。你想确保函数可以处理错误的调用。 – ethrbunny 2011-12-28 16:51:01

1

它完全依赖于您提供的公共API,以及特定函数是否可以信任其输入有效的必然结果。在防守编码和编写清晰简洁的代码之间总是存在一种权衡。

B公共API的一部分吗?如果是这样,我会说你通常不应该信任来自未知代码的输入(例如你的API的消费者),在B中的检查也是如此。

1

这取决于你的程序,有时你需要检查所有条件,有时你不需要。如果你的构造函数保证了所有数据成员的实例化,那么你只需要检查你对操作数据成员的数据的输入。因此,只要确保接受改变数据成员的参数的函数被检查为空值,但即使此时它依赖于正在使用的编程语言。

如果您想要更准确的答案,需要更多信息。