Devo ridurre la complessità ciclomatica dei miei test di input. Non ho controllo sugli input, quindi devo passare attraverso tutti questi controlli.
if(y1 < 2000 || y2 < 2000 ||
!(m1 >= 1 && m1 <= 12) ||
!(m2 >= 1 && m2 <= 12) ||
!(d1 >= 1 && d1 <= DaysInMonth(m1)) ||
!(d2 >= 1 && d2 <= DaysInMonth(m2)) ||
(m1 == 2 && IsLeap(y1) && !(d1 >= 1 && d1 <= DaysInMonth(m1) + 1)) ||
(m2 == 2 && IsLeap(y2) && !(d2 >= 1 && d2 <= DaysInMonth(m2) + 1)))
{
return 0;
}
C'è un modo, per renderlo meno complesso. Dovrei avvicinarmi a questo in modo diverso?
Modifica
Grazie a tutti. Sono riuscito ad abbassare la complessità. Fondamentalmente il problema principale era con la funzione DaysInMonth, poiché non gestiva gli anni bisestili. All'inizio era solo una piccola funzione di supporto e non avevo bisogno di gestire gli anni bisestili. Ma alla fine è cambiato, così ho intonato la logica del bisestile al di fuori di esso ovunque mi servisse.
Ho ottimizzato un po 'DaysInMonth con l'aiuto dei tuoi esempi e la complessità ciclomatica è diminuita.
Ho anche creato una funzione per il controllo della data non valido e passata alle disgiunzioni.
Quindi questo è il mio risultato.
int IsInvalidDate(int year, int month, int day) {
return year < 2000 ||
month < 1 || month > 12 ||
day < 1 || day > DaysInMonth(year, month);
}
...
if(IsInvalidDate(y1, m1, d1) || IsInvalidDate(y2, m2, d2)) {
return 0;
}