一段代码,我有这样的方法验证密码:圈复杂度与多个出口
/**
* Checks if the given password is valid.
*
* @param password The password to validate.
* @return {@code true} if the password is valid, {@code false} otherwise.
*/
public static boolean validatePassword(String password) {
int len = password.length();
if (len < 8 || len > 20)
return false;
boolean hasLetters = false;
boolean hasDigits = false;
for (int i=0; i<len; i++) {
if (!Character.isLetterOrDigit(password.charAt(i)))
return false;
hasDigits = hasDigits || Character.isDigit(password.charAt(i));
hasLetters = hasLetters || Character.isLetter(password.charAt(i));
}
return hasDigits && hasLetters;
}
让我们专注于圈复杂度号码:这是它的价值?
Metrics 1.3.6说这是7,但我真的找不到七个独立的路径:我只找到5个! Wikipedia没有太多帮助—我想如何使用这个公式π - s + 2
?
我有2 if
的,1 for
和3个退出点,但我卡住了:我必须计算入口点吗?因为它有两个条件,我应该计算两次第一个if
吗?
编辑:
好了,现在我发现,圈数是7,这意味着,有7条独立的路径,所以我应该可以,如果我愿意支付100找到7种不同的测试案例%的代码,我说得对吗?
嗯,我还是找不到最后一个! 我发现这些:
- 有效期:asdf1234
- 太短:asdf123
- 太长:asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
- 无效字符:ASDF * 123
- 所有位数:12345678
- 否 - 数字:asdfghjk
- wtf ???
看在我的答案归一化代码的数量 - 分支
第7条分支是'for'循环终止的时候。一条路径进入for循环,另一条路径退出。你从来没有在你的代码中运行'for'循环的情况,因为你在函数启动时检查了'len <8',但是简单的自动代码分析并不能反映出来。 – Claudiu 2013-03-13 18:02:58
@Claudiu:我认为可能是这样,但我不确定......我的疑问是:为什么'for'需要两次计数,其中'if'和其他所有计数只计算一次?即使“if”陈述有两种方式,但只能通过一种方式递增ccn,因此也应该执行“for”。 :| – tmh 2013-03-13 18:07:53