具有多个出口点的一段代码中的Cyclomatic Complexity

tmh*_*tmh 5 java complexity-theory return cyclomatic-complexity

我有这个验证密码的方法:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

让我们关注圈复杂度数:它的价值是什么?

度量1.3.6表示它是7,但我找不到七条独立的路径:我只找到5条!和维基百科没有帮助了多少,怎么了,我想用这个公式? - s + 2

我有2个if,1个for和3个退出点,但我卡住了:我是否必须计算入口点?if因为它有两个条件,我应该先计算两次吗?

编辑:

好的,现在我发现Cyclomatic Number是7.这意味着有7个独立的路径,所以如果我要覆盖100%的代码,我应该能够找到7个不同的测试用例,对吗?

好吧,我还是找不到最后一个!我找到了这些:

  1. 有效:asdf1234
  2. 太短了:asdf123
  3. 太久了:asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
  4. 字符无效:asdf*123
  5. 全位数:12345678
  6. 无数字:asdfghjk
  7. 跆拳道???

She*_*lum 3

我认为诀窍在于逻辑运算符被计算在内。

基于McCabe 圈复杂度部分下的指标链接 ( http://metrics.sourceforge.net/ ):

1 初始流量

3 个决策点(if、for、if)

3 个条件逻辑运算符 (||,||,||)

总数:7