有一个不必要的函数调用而不是使用else更好吗?

时间:2015-10-12 19:15:00

标签: if-statement coding-style

所以我今天和同事讨论过。他强烈建议我从

更改代码
function->setValue(false)
if(condition){
    function->setValue(true)
}

UITabBarController* tabbarController = (UITabBarController*) self.tabBarController;
NSLog(@"%@",tabbarController);
NSLog(@"%@",self.navigationController.tabBarController);

为了避免' else'我不同意,因为 - 虽然它可能在某种程度上提高了可读性 - 在if条件为真的情况下,我们有一个绝对不必要的函数调用。

你们有什么想法?

1 个答案:

答案 0 :(得分:0)

咩。

要做到这一点,只是为了避免else愚蠢(至少应该有更深层的理由)。通常没有额外的分支成本,特别是在优化器完成后。

代码紧凑性有时可能是一种理想的美学,特别是如果花费大量时间浏览和搜索代码而不是逐行阅读代码。有时可能有合理的理由支持terser代码,但它总是缺点和优点。但即使代码紧凑也不应该将逻辑塞进更少的代码行中,而不仅仅是直接的逻辑。

这里的正确性可能更容易与其中一个实现。这一点在评论中提到你可能不知道与调用setValue(false)相关的副作用,尽管我认为这有点没有实际意义。函数应该具有最小的副作用,如果它们不是完全明显的话,它们都应该在接口/使用级别上进行记录,如果我们不确切地知道它们是什么,我们应该花更多的时间来查找它们的文档。调用它们(一旦确定它们的确定依赖性,它们的副作用就不应该改变)。

鉴于此,有时可能更容易实现正确性并使用开始将状态初始化为某个默认值的解决方案来维护它,并使用一种代码形式在特定的代码分支中覆盖它。从这个角度来看,您的同事提出的建议可能是有效的,以避免将来绊倒该代码。再说一次,对于一对简单的if / else分支,这几乎不是什么大问题。

不要担心这种极端可能的恒定时间函数调用的成本,无论是在这种膝盖深度的微级实现情况下,尤其是在此代码周围没有超紧密的性能关键循环(甚至在那之后,仍然更愿意在剖析后至少在后见之明中担心这一点。

我认为有比这种编码风格更好的思考方式,比如测试程序。可靠的代码往往需要较少的重访,并且可以自由地以更多种方式编写而不会引起争议。测试是建立可靠性的基础。关于编码风格的最大争议倾向于跟随那些由于缺乏可靠性,模块化,过度耦合等而从不同的人一遍又一遍地调整相同代码体的团队。这是一个症状问题,但不一定是根本原因。