就最佳/最常见的编程实践而言,代码应该在哪里阻止调用某些函数,同时牢记性能?
例如,如果我有一个在错误的时间调用可能会破坏的函数,这些方法中最常见的是哪种?
A:
Data *someData = new Data;
while(running)
{
ProcessData(someData);
};
void ProcessData(Data *data)
{
if(data)
data->member = 5;
}
B:
Data *someData = new Data;
while(running)
{
if(someData)
ProcessData(someData);
};
void ProcessData(Data *data)
{
data->member = 5;
}
编辑:澄清,我问的是函数是否应该自己进行验证,或者依赖客户端代码在错误的状态下不调用函数。
如果一个函数可能是5个深度调用,那么为每个函数添加验证可能会给代码增加相当多的额外批量,并且可能会损害性能,但更重要的是会降低代码的可读性。
所以我在问这个情况下普通开发人员的期望
答案 0 :(得分:3)
您的意思是何时进行输入验证?好吧,在你的> = O( n )循环之外,如果你可以检查O(1)时间和 n 可能非常大。
但是,如果你的例子中的选择是在公开宣传的函数内进行一次检查,或者在客户代码中进行一次检查,那么一定要在函数中进行。否则,这将是过早优化的情况,即Root of All Evil(TM)。
答案 1 :(得分:3)
对于这种特定情况,最常见的方法可能是
void ProcessData(Data& data) {
data.member = 5;
}
或者
void Data::Process() {
member = 5;
}
如果没有有效的Data
对象可以调用这两个对象,那么就不需要进行无关的测试。另外,文档是你的朋友:如果只能在初始化主事件循环后调用函数,那么请确保函数的文档说“在初始化主事件循环后才调用此函数。”
更多信息取决于您的具体情况。
答案 2 :(得分:1)
嗯,总的来说,如果您决定是否尽可能高地调用长函数链以避免不必要的调用/返回,那么它会更好一点。那就是说,我真的不明白你的问题或例子......
答案 3 :(得分:1)
对有效参数的验证方法调用具有性能成本,但在发生错误时也存在“成本”。例如,内核函数不允许内部崩溃 - 它可能会导致整个系统崩溃。
一般来说,我要看的是调用者和被调用者是如何紧密耦合的。如果它们都在你的直接控制之下,那么被调用者可能会相信它不会被垃圾调用。但如果您控制较少,则可能需要更多验证。