Detekt

by KINH HOANG` HON
529 views

Xin chào các bạn, lại là tôi đây, bài viết lần này tôi sẽ chỉ cho các bạn cách cải thiện mã nguồn của bạn với Detekt.

Detekt là gì?
Detekt là một công cụ để phân tích code cho lập trình kotlin. Nó hoạt động dựa trên các cú phúp trừu tượng được cung cấp bởi trình biên dịch kotlin.

Detekt có những đặc trưng nào?

  • Phân tích code smell cho các dự án kotlin của bạn.
  • Báo cáo độ phức tạp dựa trên các dòng code. Độ phức tạp của McCabe và số lượng code smells.
  • Cấu hình cao (rule set or rule level)
  • Loại bỏ các phát hiện với chú thích của kotlin là @Suppress và java là @SuppressWarnings
  • Xác định ngưỡng code smell sẽ phá vỡ bản build của bạn và in ra cảnh báo.
  • Code smell baseline và bỏ qua danh sách legacy của dự án.
  • Gradle Plugin để phân tích code qua Gradle Build.
  • Grade task sử dụng IntelliJ để định dạng và kiểm tra mã kotlin.
  • Tuỳ chọn cấu hình của detekt cho mỗi module bằng cách sử dụng profiles (gradle-plugin).
  • Tích hợp SonarQube.
  • Có thể mở rộng bằng quy tắc riêng và FileProcessListener’s.
  • Tích hợp IntelliJ.

Sử dụng detekt như nào?
Trước tiên, bạn hãy cấu hình trong gradle build file.

configurations {
    detekt
}

task detekt(type: JavaExec) {
    main = "io.gitlab.arturbosch.detekt.cli.Main"
    classpath = configurations.detekt
    def input = "$projectDir/src/"
    def config = "$rootDir/detekt/detekt-config.yml"
    def filters = ".*/techover.detekt/.*"
    def output = "$rootDir/detekt/reports"
    def params = ['-i', input, '-c', config, '-f', filters, '-o', output]
    args(params)
}

dependencies {
    detekt "io.gitlab.arturbosch.detekt:detekt-cli:$detekt_version"
}

Chúng ta cùng đi tìm hiểu trong task detekt bên trên có những gì?
def input = "$projectDir/src/" là phần nào trong dự án mà bạn muốn được phân tích.
def config = "$rootDir/detekt/detekt-config.yml" là phần bạn cài đặt sẽ sử dụng những quy tắc nào để phân tích.
def filters = ".*/techover.detekt/.*" là phần loại bỏ không cần phân tích, với nhiều đường dẫn khác nhau thì bạn sử dụng dấu phẩy để phân tách.
def output = "$rootDir/detekt/reports" là phần mà khi chạy phân tích sẽ đưa ra tài liệu báo cáo.

Bạn có thể sử dụng detekt-config.yml tham khảo ở đây.

Vậy là bạn đã có thể chạy detekt cho dự án của bạn rồi, bằng cách chạy câu lệnh:

./gradlew detekt

Sau khi chạy câu lệnh gradlew bên trên thì sẽ xuất hiện output như dưới đây:

Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for details

> Task :app:detekt

Successfully generated XmlOutputReport.
Successfully generated PlainOutputReport.

detekt run within 1019 ms

BUILD SUCCESSFUL in 14s
1 actionable task: 1 executed

Như vậy là source code của dự án bạn đang không có lỗi nào.
Nếu như bạn chạy mà source code có lỗi thì sẽ hiển thị như sau:

> Task :app:detekt
Ruleset: code-smell
Ruleset: comments
Ruleset: complexity
Ruleset: empty-blocks
Ruleset: exceptions
Ruleset: performance
Ruleset: potential-bugs
Ruleset: style
        WildcardImport - [ExampleInstrumentedTest.kt] at androidTest/java/techover/detekt/ExampleInstrumentedTest.kt:9:1
        WildcardImport - [ExampleUnitTest.kt] at test/java/techover/detekt/ExampleUnitTest.kt:5:1
        FunctionNaming - [addition_isCorrect] at test/java/techover/detekt/ExampleUnitTest.kt:13:5
        FunctionNaming - [addition_isCorrect] at test/java/techover/detekt/ExampleUnitTest.kt:13:5
        MagicNumber - [addition_isCorrect] at test/java/techover/detekt/ExampleUnitTest.kt:15:22

Successfully generated XmlOutputReport.
Successfully generated PlainOutputReport.

detekt run within 1203 ms

BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

Để bạn có thể hiểu hơn về tập tin cấu hình mà bạn tham khảo ở link bên trên detekt-config.yml thì dưới đây tôi sẽ nói qua về phần này cho bạn hiểu hơn.

Tập tin cấu hình detekt có những gì?
Detekt sử dụng tệp cấu hình kiểu yaml cho nhiều thứ khác nhau:

  • Bộ quy tắc và thuộc tính quy tắc.
  • Build thất bại.
  • Bộ xử lý tệp kotlin.
  • Console và định dạng đầu ra.

Bộ quy tắc và quy tắc:
Detekt cho phép dễ dàng chỉ cần chọn các quy tắc bạn muốn và cấu hình chúng theo cách bạn muốn. Ví dụ, nếu bạn muốn cho phép tối đa 20 chức năng trong tệp Kotlin thay vì ngưỡng mặc định là 10.

complexity:
  TooManyFunctions:
    threshold: 20

Bộ lọc đường dẫn / Không bao gồm / Bao gồm:
Bắt đầu với phiên bản RC15 bộ lọc đường dẫn có thể được xác định cho từng quy tắc hoặc bộ quy tắc:

complexity:
  TooManyFunctions:
    ...
    excludes: "**/internal/**"
    includes: "**/internal/util/NeedsToBeChecked.kt"

Bảng điều khiển và báo cáo đầu ra:

console-reports:
  active: true
  exclude:
  #  - 'ProjectStatisticsReport'
  #  - 'ComplexityReport'
  #  - 'NotificationReport'
  #  - 'FindingsReport'
  #  - 'FileBasedFindingsReport'
  #  - 'BuildFailureReport'

output-reports:
  active: true
  exclude:
  #  - 'HtmlOutputReport'
  #  - 'TxtOutputReport'
  #  - 'XmlOutputReport'

Bộ vi xử lý (Bộ xử lý thường được sử dụng để nâng cao số liệu dự án):

processors:
  active: true
  exclude:
  # - 'FunctionCountProcessor'
  # - 'PropertyCountProcessor'
  # - 'ClassCountProcessor'
  # - 'PackageCountProcessor'
  # - 'KtFileCountProcessor'

Link tham khảo:

  • https://arturbosch.github.io/detekt/index.html
  • https://github.com/arturbosch/detekt

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.