2008-09-19 39 views
34

Có công cụ nào để tính toán Độ phức tạp của Cyclomatic trong Javascript không?Tính Độ phức tạp của Cyclomatic cho Javascript

Tôi đã tìm thấy nó một số liệu rất hữu ích trong quá khứ trong khi làm việc trên mã phía máy chủ, và muốn có thể sử dụng nó cho phía khách hàng Javascript tôi viết.

+0

tôi đã chuyển công cụ jsmeter của tôi đến một địa điểm mới: http://jsmeter.info – Noah

Trả lời

18

Tôi đã làm việc trên một công cụ phân tích mã JavaScript tĩnh làm caclulate phức tạp chu kỳ cho JavaScript. Bạn có thể thử phiên bản trực tuyến của jsmeter tại đây: http://jsmeter.info

+1

Công cụ của bạn không tương thích với ECMAScript5. Nó không thể phân tích cú pháp một đối tượng thông thường như: '{a: 2,}' – mgol

+1

@m_gol Dấu phẩy theo dấu FYI là thực tiễn không tốt và sẽ gây ra lỗi trong một số trình duyệt. –

+4

@RobEvans Không, dấu phẩy theo dấu phẩy không phải là một thực tế tồi, đó là ý kiến ​​chủ quan của bạn. Ngược lại, dấu phẩy theo sau có thể hữu ích khi chúng giúp ích với git diffs vì bạn không cần phải thay đổi các dòng xác định các phần tử khác nếu bạn thêm/xóa một phần tử mới. Đối với "một số trình duyệt" - về cơ bản là IE <9. Nếu bạn không cần quan tâm đến chúng, bạn có thể sử dụng dấu phẩy. Trong các dự án của riêng tôi, tôi thường thực thi dấu phẩy sau trong hướng dẫn kiểu vì các lý do đã đề cập. – mgol

6

Kể từ cyclomatic phức tạp được đánh giá đếm số lượng các từ khóa "nếu, chuyển đổi, trong khi đối với break" vv .. mỗi công cụ làm việc với C sẽ thực hiện công việc, như sourcemonitor: http://www.campwoodsw.com/sourcemonitor.html

Trên thực tế, trên javascript bạn càng cố gắng modulize mã của bạn, bạn sẽ càng làm chậm nó xuống, do đó mang nó với một hạt muối;)

EDIT: tôi Thật có thể không hiểu những gì đang xảy ra trên câu trả lời này , Tôi nhận được một downvote khác, khi trong câu trả lời của tôi, tôi nói với ag ood công cụ để tính toán phức tạp cyclomatic trong javascript, và điều này đặc biệt hoạt động rất tốt.

Đối với sự khẳng định thứ hai, tôi là một lời nhận xét đó xuất phát từ kinh nghiệm, tôi không bao giờ nói không modulize mã js của bạn, tôi chỉ nói đến làm cho sự chú ý trong làm việc đó, bởi vì thường có một sự cân bằng với tốc độ và khi tôi nói về tốc độ, có nghĩa là 2 sự chậm lại khác nhau có thể xảy ra: tại thời gian tải xuống và tại thời gian thực hiện (và trong thiết bị chậm như pda/smartphone, điều này là quan trọng).

Kể từ khi công cụ như thế này thường lái xe phát triển vào viết mã nhiều cố gắng đuổi theo chỉ số nhỏ hơn có thể, nhưng trong js nhiều mã không may có nghĩa là chậm có thể xảy ra, và lạm dụng của những công cụ này là xấu. Rất tiếc, những công cụ này có thể cung cấp cho bạn các gợi ý về số trong đó mã của bạn có thể được cải thiện, nhưng bạn phải nắm vững cách sử dụng công cụ và không mù quáng dựa vào nó.

Vì vậy, nếu bạn downvote tôi một lần nữa, xin vui lòng viết bình luận trong đó bạn giải thích lý do tại sao bạn làm như vậy, các cuộc thảo luận chỉ có thể hưởng lợi từ điều này, cảm ơn bạn và xin lỗi cho lỗ thông hơi.

+0

modularizing mã của bạn chậm là nó xuống? điều đó có nghĩa gì? – MDCore

+1

Trên thực tế nó có ý nghĩa, vì trong javascript viết nhiều mã có nghĩa là thời gian tải xuống nhiều hơn (là một sự cân bằng mà tất cả đều biết btw), tôi đã viết mã javascript chạy trong kiến ​​trúc rất chậm, vì vậy, đây là một yếu tố quan trọng. Tôi đã không nói "không modulize", tôi chỉ nói "được cảnh báo" – kentaromiura

+0

Tôi đã không downvote bạn, nhưng nó không có vẻ như modularized chậm xuống mã của bạn trong javascript là đủ để biện minh bằng văn bản mã của bạn trong một phong cách thủ tục. Nhưng tôi đoán đó là cơ sở từng trường hợp. –

2

Bạn có thể sử dụng công cụ ccm từ http://www.blunck.info/ccm.html.

Nó thực hiện java-script, c/C++ và C#. Nó hoàn toàn miễn phí, chạy trên Windows (có thể chạy trên Linux và Mac OS X - sử dụng khung đơn).

2

Có bây giờ cũng tiêu chuẩn đánh giá: https://github.com/calmh/yardstick

Nó cố gắng tính toán phức tạp cyclomatic cho thành ngữ Javascript, xử lý trường hợp nhiều hơn ví dụ jscheckstyle.

17

tôi đã giúp viết một công cụ để thực hiện phân tích phần mềm phức tạp trên các dự án JavaScript:

complexity-report

Nó báo cáo một loạt các số liệu phức tạp khác nhau: dòng mã, số lượng các thông số, độ phức tạp cyclomatic, mật độ cyclomatic, Các biện pháp phức tạp Halstead, chỉ số bảo trì, mật độ đơn hàng đầu tiên, chi phí thay đổi và kích thước lõi.

Nó được phát hành theo giấy phép MIT và được xây dựng bằng cách sử dụng Node.js và trình phân tích cú pháp JavaScript Esprima. Nó có thể được cài đặt thông qua NPM, như vậy:

npm i -g complexity-report 
+0

Đây là công cụ tuyệt vời. Nó sẽ hữu ích hơn nếu nó có thể được sử dụng như là nhiệm vụ grunt. Sau đó, chúng tôi có thể xem báo cáo này tại mỗi công trình! – ShitalShah

+0

Chỉ tìm thấy tác vụ grunt cho công cụ này: https://npmjs.org/package/grunt-complexity – ShitalShah

+0

JSComplexity.org: Tên miền này đã hết hạn – P5ycH0

5

JSHint gần đây added support để tính số liệu mã. Bạn có thể thiết lập giá trị tối đa cho the number of formal parameters allowed (maxparams), how deeply nested code blocks should be (maxdepth), the number of statements allowed per function (maxstatements), cũng như the maximum cyclomatic complexity (maxcomplexity).

Số lượng tối đa các thông số hình thức cho phép mỗi chức năng

/*jshint maxparams:3 */ 

function login(request, onSuccess) { 
    // ... 
} 

// JSHint: Too many parameters per function (4). 
function logout(request, isManual, whereAmI, onSuccess) { 
    // ... 
} 

Số lượng tối đa của khối mã lồng nhau cho phép mỗi chức năng

/*jshint maxdepth:2 */ 

function main(meaning) { 
    var day = true; 

    if (meaning === 42) { 
    while (day) { 
     shuffle(); 

     if (tired) { // JSHint: Blocks are nested too deeply (3). 
      sleep(); 
     } 
    } 
    } 
} 

Tối đa số báo cáo cho phép mỗi chức năng

/*jshint maxstatements:4 */ 

function main() { 
    var i = 0; 
    var j = 0; 

    // Function declarations count as one statement. Their bodies 
    // don't get taken into account for the outer function. 
    function inner() { 
    var i2 = 1; 
    var j2 = 1; 

    return i2 + j2; 
    } 

    j = i + j; 
    return j; // JSHint: Too many statements per function. (5) 
} 
10

Đối với đầy đủ trong các câu trả lời, tôi đang tìm kiếm các công cụ cùng một số thời gian trước đây và không tìm thấy bất cứ điều gì làm việc tốt cho visualization vì vậy tôi đã viết plato

báo cáo mẫu cho:

Nó sử dụng báo cáo phức tạp của phil (đã đề cập ở trên) và cũng tổng hợp dữ liệu từ jshint (và cuối cùng là những thứ khác).

+0

Tôi vừa mới có mặt tại buổi thuyết trình của @jsoverson tại Fluent 2014 ở San Francisco và đã rất ấn tượng! –

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