不一定坏。基类中的方法通常调用空方法,这些方法被用作子类的覆盖点。示例:Cocoa Touch的UIView具有一种-didAddSubview:
方法,在默认版本中该方法被记录为不执行任何操作。UIView的-addSubview:
方法-didAddSubview:
即使不执行任何操作也必须调用,因为子类可以实现它以执行某些操作。当然,不做任何事情的方法及其原因都应记录在案。
如果出于历史原因显然存在空的或无用的功能/方法,则应将其切除。如果不确定,请查看源代码存储库中代码的早期版本。
很难说,没有上下文就可以了。如果出于相同的原因明确地进行了检查,则可能意味着没有明确的职责分离,需要进行一些重构,尤其是当两个检查都导致采取相同的操作时。如果两次检查的结果都不相同,那么即使条件相同,两次检查也可能出于不同的原因而进行,这可能还可以。
之间有很大的区别:
if (1) {
// ...
}
和:
if (foo() == true) {
// ...
}
哪里foo()
总是回来true
。
人们调试时,第一种情况经常发生。if (0) {...
在尝试隔离错误时,可以使用和临时删除一部分代码,然后将更0
改为1
来恢复该代码。在if
一旦你完成,当然,应该被删除,但它很容易忘记这一步,或错过一个或两个,如果你已经在几个地方做了。(最好是在注释中标识这些条件,以便以后搜索。)唯一的危害是将来可能引起的混乱。如果编译器可以在编译时确定条件的值,则会将其完全删除。
第二种情况是可以接受的。如果foo()
需要从代码中的多个位置测试所代表的条件,则将其分解为单独的函数或方法通常是正确的选择,即使foo()
现在总是正确。如果可以想到foo()
最终可能会返回false
,那么在方法或函数中隔离该条件是识别代码依赖于该条件的所有位置的一种方法。但是,这样做确实会带来一些风险,那就是该foo() == false
条件将未经测试,并可能在以后导致问题。解决方案是确保添加显式测试false
案例的单元测试。
这听起来像是历史的人工产物,可以在代码审查期间或通过软件的定期分析来识别。我想它可能是有意创建的,但是我很难想象有人会故意这样做。
if (false) {...}
块非常适合注释代码!</