一段代碼,我有這樣的方法驗證密碼:圈複雜度與多個出口
/**
* 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