2016-02-26 21 views
5

Tôi có một khối mã mà tôi đang gặp sự cố làm giảm độ phức tạp của chu trình. Bởi vì nhiều điều kiện phải phù hợp, tôi không chắc chắn cách tốt nhất để phá vỡ nó thêm nữa. Các vấn đề phức tạp là trong 2 trường hợp một đối tượng mới được tạo ra, nhưng không phải trong đối tượng thứ ba (nó gọi ra một phương thức khác). Đây là giả:Giảm độ phức tạp của Cyclomatic

if (!cond3 && !cond1 && cond2 && cond4) { 
     // actions to perform 
     calculateValues(); 
     return result; 
    } else if (!cond1 && cond2 && cond3) { 
     // actions to perform 
     Object result = new Result(); 
     return result; 
    } else if (!cond4 && cond3 && cond1 && cond5) { 
     // actions to perform 
     Object result = new Result(); 
     return result; 
    } else { 
     // throw error because inputs are invalid 
    } 
+2

Có vẻ ổn với tôi. –

+0

@LouisWasserman, có phải là mỉa mai không? – jaco0646

+2

@ jaco0646, không, không phải. –

Trả lời

6

Bạn nên cấu trúc lại mã đó, sử dụng phương pháp này để tóm tắt những điều kiện, cao cyclomatic chỉ ra rằng các mã cần tái cấu trúc. Ví dụ, cho phép nói rằng: !cond4 && cond3 && cond1 && cond5 kiểm tra nếu người dùng đã đăng nhập có một chiếc xe, sau đó bạn nên cấu trúc lại rằng sự kết hợp của các điều kiện để một phương pháp:

private boolean loggedUsedHasCar() { 
    return !cond4 && cond3 && cond1 && cond5; 
} 

làm điều tương tự với các điều kiện khác. Các câu hỏi if có 4 điều kiện có thể rất khó đọc. Trích những tuyên bố sẽ giảm độ phức tạp phương pháp cyclomatic của bạn và làm cho mã của bạn dễ đọc hơn

1

Bạn có thể làm giảm độ phức tạp cyclometric đến 11 với khai thác một phần chung của các phương trình của bạn như mới biến

boolean common = !cond1 && cond2; 
... 
if (!cond3 && common && cond4) { 
    // actions to perform 
    calculateValues(); 
    return result; 
} else if (common && cond3) { 
    // actions to perform 
    Object result = new Result(); 
    return result; 
} else if (!cond4 && cond3 && cond1 && cond5) { 
    // actions to perform 
    Object result = new Result(); 
    return result; 
} else { 
    // throw error because inputs are invalid 
}  
2

Tôi thực sự quan tâm đến vấn đề của bạn và cố gắng đề xuất trước đó giải pháp với chiết xuất điều kiện để phương pháp riêng biệt như thế này

public class Test { 

public static void main(String[] args) { 
    cyclometricComplexityTest(); 
} 

static boolean cond1 = true; 
static boolean cond2 = true; 
static boolean cond3 = true; 
static boolean cond4 = true; 
static boolean cond5 = true; 

public static Object cyclometricComplexityTest() { 
    if (isBoolean1()) { 
     // actions to perform 
     Object result = null; 
     calculateValues(); 
     return result; 
    } else if (isBoolean2()) { 
     // actions to perform 
     Object result = new Result(); 
     return result; 
    } else if (isBoolean3()) { 
     // actions to perform 
     Object result = new Result(); 
     return result; 
    } else { 
     throw new RuntimeException(); 
    } 
} 

static boolean isBoolean1() { 
    return !cond3 && !cond1 && cond2 && cond4; 
} 

private static boolean isBoolean2() { 
    return !cond1 && cond2 && cond3; 
} 

private static boolean isBoolean3() { 
    return !cond4 && cond3 && cond1 && cond5; 
} 

static void calculateValues() {} 

static class Result {} 
} 

Kết quả giảm độ phức tạp của Cyclometric ở đây (tôi đã sử dụng MetricsReloaded IntelliJ IDEA plugin). Nó thực sự hoạt động bằng cách truyền bá sự phức tạp giữa các phương pháp chính và phụ trợ :)

enter image description here

T.B. điều thú vị: Tôi đã cố gắng trích xuất các điều kiện của bạn dưới dạng biến cục bộ và nó đã không làm giảm độ phức tạp của phương pháp như tôi dự kiến ​​ban đầu.

Các vấn đề liên quan