mam to metoda, która sprawdza się hasło: skupićZłożoność cykliczna w kawałek kodu z wieloma punktami wyjścia
/**
* 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;
}
Miejmy na cyclomatic liczby Złożoność: jaka jest jego wartość?
Metrics 1.3.6 mówi, że to 7, ale nie mogę znaleźć siedmiu niezależnych ścieżek: znajduję tylko 5! I Wikipedia nie pomogło zbytnio — jak mam użyć tej formuły π - s + 2
?
Mam 2 if
, 1 for
i 3 punkty wyjścia, ale utknąłem: czy muszę liczyć punkt wejścia? Czy powinienem policzyć dwa razy pierwsze if
, ponieważ ma on dwa warunki?
EDIT:
Ok, teraz okazało się, że numer jest Cyclomatic 7. Oznacza to, że istnieje 7 niezależnych ścieżek, a więc powinien być w stanie znaleźć 7 różnych przypadków testowych jeśli chciałbym na pokrycie 100 % kodu, czy mam rację?
Cóż, nadal nie mogę znaleźć ostatniego! znalazłem te:
- Ważny: asdf1234
- zbyt krótki: asdf123
- Too Long: asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
- Nieprawidłowy znak: asdf * 123
- All-cyfrowy: 12345678
- no- cyfry: asdfghjk
- wtf ???
spojrzeć na znormalizowanego kodu w mojej odpowiedzi. Po uwzględnieniu zwarcia '||' i '&&' masz 7 instrukcji rozgałęzień – Claudiu
7. gałąź jest po zakończeniu pętli 'for'. Jedna ścieżka przechodzi w pętlę for, druga gaśnie. Nigdy nie masz przypadku, w którym pętla 'for' nie działa w twoim kodzie, ponieważ sprawdzasz' len <8' na początku swojej funkcji, ale prosta automatyczna analiza kodu tego nie odzwierciedli. – Claudiu
@Claudiu: Myślałem, że to możliwe, ale nie byłem pewien ... moje wątpliwości są następujące: dlaczego "za" należy policzyć dwa razy, gdzie "jeśli" i wszystko inne liczy się tylko raz? Nawet instrukcja "if" ma dwukierunkowy przyrost, ale zwiększa wartość ccn tylko o jeden i tak samo powinno się robić 'for'. : | – tmh