扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
为了不遗漏条件,必须注意以下2点:
1. 编写正确的条件式
为了“写出正确的条件式”,需要通过条件式的变换来验证写出的条件式是否表达了我们本来的意图(参考补充说明)。
在此基础上,如果构成条件的表达式非常复杂,就需要使用真值表对条件式构成及关系进行整理(参考补充说明表)。
2. 没有遗漏地编写条件
为了“没有遗漏地编写条件”,下面几点非常重要:
① 设计时进行充分的讨论(这点最为重要)。
② 实现时,特别注意与if相应的else有没有,与switch相应的default分支是否存在。如果没有,则需要明确理论,明确没有的理由。
参考:检查编写的理论表达式是否覆盖了所有条件的方法
把条件翻转过来考虑就可以了。比如说,“ A || B || C”这样一个条件,就考虑翻转之后的”(!A)&&(!B)&&(!C)”。
如果能够找到满足这个翻转后条件的输入,则说明还没有覆盖所有的条件。
例:没有能够覆盖所有条件的情况
switch (status) { case STATUS_INIT; … |
…
// ERROR: 没有记述default的情况
} // 究竟是忘了写呢,还是根本不会发生default的情况呢?这里无法判断
… If ( variable < constantVar2) { … } else if (variable < constantVar3) { … } // ERROR:没有相应的else |
补充说明:使表达式更容易理解的方法 以及 返回真假值方法的注意点
在编写表达式时同时编写多个表达式,从中选择一个最容易理解的即可。
有些条件是可以用多个表达式来编写的。例如下面这两个表达式是等价的。
① if (x != 1 || x != 2)
② if (! (x == 1 && x == 2))
对于①来说,很难一眼就断定是个Bug。但是, ②呢,一眼就可以看出来“x 等于 1,并且等于2”是个Bug。
下面,设想一下返回真假值的情况。这时,如果做一个方法,当P为真时返回一个假的话,就成了“没有不是P的情况”的二重否定,很容易导致解释时的混乱。因此,即使想要检查的条件是P的否定,也最好先写一个判定P的方法,在调用的时候用“if (! isActive())…”这样的否定形来判断。
利用真值表来整理各种条件及其取值
条件表达式 C: ( x > 0 ) && (( y < z ) || !( z == x)) X > 0Y < ZZ == X评价值 TTTT TTFT TFTF TFFT FTTF FTFF FFTF FFFF 注:图中的记号 T … 真 F … 假 |
参考:布尔操作符 && ,|| 的右边不允许包含有带有副作用(#)的表达式
&&,||是布尔操作符,右边的操作数并不一定每次都被判断
① x && y 的情况,当x为false时,y将不被判断
② x || y 的情况,当x为true时,y将不被判断
因此,对y(右侧操作数)有副作用的表达式是不允许包含的。
# 使运行环境发生变化的作用。有代表性的例子是变量值的变化,文件读写等。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者