Detekt: Deteksi Otomatis Potensi Code Smell di Kotlin

Mochamad Noor Syamsu
Hyperjump Tech
Published in
4 min readJan 22, 2021

Apa itu Code Smell?

Code smells dapat diibaratkan seperti puncak gunung es yang terlihat di permukaan dari masalah yang tersembunyi di bawah laut. Namun, tidak selamanya code smell berarti masalah. Kamu harus memeriksanya lebih lanjut untuk setiap code smell yang ditemukan.

refactoring.guru

Salah satu contoh code smell adalah jumlah parameter konstruktor yang terlalu banyak. Tapi jumlah parameter konstruktor yang banyak sering dijumpai pada data class. Maka, contoh code smell tersebut bisa kamu abaikan.

Jika kamu mengembangkan perangkat lunak dengan kotlin, untungnya kita dapat melakukan deteksi code smell menggunakan detekt.

Apa itu Detekt?

Detekt adalah perangkat lunak yang dikembangkan khusus untuk mendeteksi code smell di proyek berbasis kotlin. Setiap kali dijalankan, detekt akan memeriksa seluruh berkas kotlin dalam codebase berdasarkan pengaturan yang sudah didefinisikan sebelumnya. Dengan detekt, berbagai macam code smell mulai dari kompleksitas, performa, hingga code style dapat diketahui hanya dengan perintah sederhana.

Peran Detekt dalam Code Review

Bertambahnya anggota sebuah tim mengakibatkan naiknya frekuensi kemunculan code smell baru untuk setiap pull request yang diajukan. Seteliti apapun pengembang dan reviewer, pasti akan ada masalah yang terlewatkan.

Detekt dapat diimplementasikan dengan mudah pada automasi CI/CD. Automasi detekt pada setiap pull request akan memotong beban kerja reviewer secara signifikan. Sehingga, reviewer bisa lebih fokus meninjau faktor lain.

Detekt pada Codebase Aplikasi Android

Untuk implementasi detekt di codebase aplikasi android, tambahkan dependensi detekt di berkas build.gradle root. Contohnya seperti berikut

Setelah itu, kamu dapat menjalankan detekt untuk mendeteksi code smell di proyek gradle dengan perintah berikut di terminal

./gradlew detekt

Jika ada code smell, detekt akan menampilkan pesan di terminal dan menyebabkan task gagal.

Selain itu, konfigurasi gradle di atas juga akan memerintahkan detekt untuk menghasilkan laporan dalam format berkas html dan xml. Berkas laporan ini dapat kamu temukan di lokasi berikut

/[nama module]/build/reports/detekt/detekt.[html/xml/txt]# contoh lokasi berkas html untuk module app
/app/build/reports/detekt/detekt.html

Kamu dapat membuka berkas laporan html di browser agar lebih mudah membacanya.

Detekt pada Existing Codebase dengan Baseline

Jika kamu sudah terlanjur memiliki codebase aplikasi yang sangat besar. Implementasi di atas akan menyebabkan pipeline CI/CD kamu selalu gagal setiap kali jalan. Bagi repository yang tidak menerima merge request dengan pipeline gagal, hal ini tentu menjadi hambatan untuk implementasi detekt. Untuk mengatasinya, detekt menyediakan cara khusus, yaitu dengan baseline.

Pertama, dari gradle script di atas, kamu perlu menghilangkan komentar pada konfigurasi berkas baseline. Kurang lebih blok kode konfigurasi detekt menjadi seperti berikut

detekt {
toolVersion = detekt_version
failFast = false
buildUponDefaultConfig = true
reports {
html.enabled = true
// xml.enabled = true
}
baseline = file("detekt-baseline.xml")
}

Selanjutnya, jalankan perintah berikut pada terminal

## generate baseline for each module based on baseline config
## e.g. /app/detekt-baseline.xml
./gradlew detektBaseline

Perintah di atas akan menghasilkan berkas bernama detekt-baseline.xml pada setiap module kamu. Jangan lupa, berkas ini juga harus kamu commit ke git repository.

Setelah berkas tersebut dihasilkan, semua code smell yang ada di codebase sebelum kamu implementasi detekt akan diabaikan ketika kamu menjalankan ./gradlew detekt. Dengan menggunakan baseline, pipeline kamu tidak akan gagal lagi dari code smell yang belum kamu bersihkan.

Membersihkan Code Smell yang Ditemukan oleh Detekt

Setelah menggunakan baseline, tentunya kamu perlu melakukan refactor secara bertahap untuk membersihkan code smells. Di dokumentasi rule sets, kamu bisa mendapatkan petunjuk untuk bagaimana sebaiknya kamu refactor. Ketika membersihkannya, jangan lupa untuk menghapusnya dari baseline, ya!

Penutup

Detekt adalah perangkat lunak yang dapat membantu kita mencari code smell di berkas kotlin dengan mudah dan cepat. Ia dapat diimplementasikan pada codebase yang baru dimulai maupun codebase yang pengembangannya sudah berjalan sebelumnya. Sehingga, kamu dapat menggunakan detekt tanpa melihatnya gagal setiap kali kamu menjalankannya.

Selain itu, detekt juga dapat menjadi nilai tambah automasi CI/CD pada codebase kamu. Dengan demikian, niscaya beban kerja code review akan lebih ringan.

Untuk konfigurasi lebih lanjut, kamu dapat berkunjung ke laman resmi mereka di https://detekt.github.io/detekt/.

Hyperjump is an open-source-first company providing engineering excellence service. We aim to build and commercialize open-source tools to help companies streamline, simplify, and secure the most important aspects of its modern DevOps practices.

--

--

Mochamad Noor Syamsu
Hyperjump Tech

Software engineer focusing around android, kotlin, and backend