2012-11-26 28 views
5

Cách tính cyclomatic complexity của toàn bộ dự án Java? Tôi có phức tạp cho mọi phương pháp, nhưng làm thế nào để tổng hợp tất cả chúng thành một số liệu? Bất kỳ ý tưởng hoặc phương pháp hiện có?Làm thế nào để tính toán độ phức tạp chu kỳ của một dự án (không phải là một lớp/chức năng)?

Tôi không tìm kiếm công cụ, nhưng đối với thuật toán.

Trung bình đơn giản hầu như không hoạt động vì có nhiều phương pháp phức tạp 1, không thực sự phức tạp, nhưng có tầm quan trọng thấp đối với cơ sở mã (trong hầu hết các trường hợp).

Trả lời

2

tôi tìm thấy công thức:

TCC = Sum(CC) - Count(CC) + 1 
TCC: Total CC 
Sum(CC): Sum of CC of all functions 
Count(CC): Number of functions 

Nguồn: http://www.aivosto.com/project/help/pm-complexity.html

Nhưng có lẽ còn quá hạn chế.

Một ý tưởng khác là xem xét biểu đồ cuộc gọi của chương trình dưới dạng chương trình và tính toán CC của biểu đồ cuộc gọi. Các nút sẽ được trọng số bởi CC của chúng. (Tôi không biết liệu nó có khả thi hay không, nó chỉ là một ý tưởng)

0

Tôi không biết liệu điều này có hữu ích hay không, nhưng tôi chỉ muốn nói những gì tôi nghĩ. Bạn có thể sử dụng một bộ đếm chiều sâu toàn cầu để có được các chiều sâu gọi phương thức và cập nhật nó trên mọi lời gọi phương thức. Bạn thấy cùng một đoạn mã được tiêm trong mọi phương thức ở đây theo cách thủ công, nhưng có thể có giải pháp để tự động chèn mã vào tất cả các phương thức. Với mức độ theo dõi stack-length, bạn có thể tính toán phức tạp tổng hợp, tôi nghĩ.

public class Cyclomatic 
{ 
    public static int max = Integer.MIN_VALUE; 

    static void a() 
    { 
     b(); 
     int temp = Thread.currentThread().getStackTrace().length; 
     if (temp > max) 
      max = temp; 
    } 

    static void b() 
    { 
     c(); 
     int temp = Thread.currentThread().getStackTrace().length; 
     if (temp > max) 
      max = temp; 
    } 

    static void c() 
    { 
     int temp = Thread.currentThread().getStackTrace().length; 
     if (temp > max) 
      max = temp; 
    } 

    public static void main(String[] args) 
    { 
     a(); 
     System.out.println(max); 
    } 
} 

Output:

5 
3

Toàn bộ cuốn sách đã được viết trên số liệu mã, do đó bạn may mắn mà bạn đang hỏi một câu hỏi cụ thể hơn. Đối với độ phức tạp chu trình Java, bạn có thể tìm thấy số phương pháp vượt quá độ phức tạp chu kỳ 5 hoặc 6 (bạn chọn số ở đây). Nếu con số này vượt quá một tỷ lệ phần trăm nhất định của số phương pháp của bạn, thì độ phức tạp tổng thể của chu trình là kém. Số lượng tốt cho tỷ lệ phụ thuộc hoàn toàn vào quy mô của dự án, vì vậy có thể thay vì chỉ chia cho số phương pháp, bạn có thể đặt trọng lượng ít hơn vào số lượng phương pháp trong bộ phận bằng cách tăng dần số lượng lớn, chẳng hạn như một căn bậc hai hoặc logarit để thử và làm cho nó ổn định hơn khi dự án phát triển.

Có lẽ một cái gì đó như thế này:

public double evaluateCyclomaticComplexity(List<MethodStat> methodStats) { 
    int bad = 0; 
    for (MethodStat methodStat : methodStats) 
     if (methodStat.getCyclomaticComplexity() >= 6) 
      bad++; 

    double denominator = Math.sqrt(methodStats.size()); 
    return bad * 100.0/denominator; 
} 

càng nhỏ số trở về quê hương, thì càng tốt. Đối với thực sự dự án không hợp lệ, điều này sẽ trả về một cái gì đó lớn hơn 100.

Chức năng mẫu số phải thể hiện tốc độ phát triển của mã phức tạp như thế nào. Thông thường, bạn muốn CC thấp hơn cho mỗi hàm khi mã tăng lên để nó vẫn duy trì được, vì vậy cái gì đó phát triển chậm hơn khi tăng kích thước dự án sẽ là tốt nhất.

Kiểm tra, chỉnh sửa, v.v. Cuối cùng, các chỉ số mã khó có thể đạt được sau khi đọc một số bài báo trên phần mềm nguồn mở sử dụng các số để biểu thị "khả năng bảo trì". Bất cứ điều gì chúng ta có thể đưa ra ở đây có thể được cải thiện rất nhiều nếu đủ thời gian cho nó.

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