Detekt ile Kod Kalitesini Artırma

İçindekiler
- Detekt Nedir?
- Neden Detekt?
- Rakip Araçlarla Karşılaştırma
- Detekt’i Projeye Dahil Etme
- Detekt ile Kod Kurallarını Özelleştirme
- Detekt Suppression Özelliği
- CI/CD Süreçlerine Entegrasyon
- Detekt Raporlama Özellikleri
- Sonuç
- Kaynakça
Detekt Nedir?
Yazılım geliştirme sürecinde, temiz ve sürdürülebilir kod yazabilmek sadece işin başlangıç aşamasıdır. Kodun kalitesi, bakım kolaylığı ve hataların zamanında tespiti yapılan işin başarısını doğrudan etkiler. Bu aşamada statik kod analiz araçları devreye girer. Kodun çalışma zamanını beklemeden, yazım aşamasında hataları tespit eden bu araçlar, geliştirme sürecini daha verimli ve hatasız hale getirir.
Detekt, Kotlin tabanlı projelerde statik kod analizini gerçekleştiren bir araçtır. Detekt, kodun kalitesini artırır, stil bozukluklarını ve potansiyel hataları erken aşamalarda tespit eder. Kotlin için özel olarak yapılandırılmış olması, bu aracı özellikle Kotlin projelerinde öncelikli tercih haline getirir.
Neden Detekt?
Geliştiriciler için kod kalitesini sürekli takip etmek, özellikle büyük projelerde veya ekip çalışmalarında teknik borçları azaltmak, bakım maliyetlerini düşürmek ve ekip içi standartları korumak kritik sorumluluklardandır. Detekt’in sağladığı özellikler bu aşamalarda büyük avantaj sağlar.
Erken Tespit
Statik analiz araçları, kod yazım aşamasında hataların tespit edilmesini sağlar. Detekt, çalışma zamanı hatalarını önlemek adına, kod yazım aşamasında stil ve yapı sorunlarını tespit ederek test ve derleme süreçlerini hızlandırır.
Okunabilirlik
Detekt, kodun okunabilirliğini artırmak için kural seti ve öneriler sunar. Karmaşık fonksiyonlar, büyük sınıflar ve isimlendirme hataları gibi sorunları tespit ederek, geliştiricilerin daha anlaşılır ve bakımı kolay kod yazmalarını sağlar.
Ekip Uyumu
Farklı ekip üyeleriyle yapılan çalışmalarda, kod kalitesinin tutarlı olması oldukça önemlidir. Detekt, belirlediğiniz kurallara göre tüm ekip üyelerinin kodlarını analiz eder, bu sayede projede tutarlılık sağlanmış olur.
Zaman ve Maliyet Tasarrufu
Detekt hataların erken aşamalarda tespit edilmesini sağladığı için, daha sonra ortaya çıkabilecek büyük hataların önüne geçmiş olur. Bu da uzun vadede zaman ve maliyet tasarrufu sağlar.
Kod Kalitesini Sürekli İzleme
Detekt, sadece kod yazım aşamasında birçok kere çalıştırılabilir. Bu sayede sürekli olarak kodu izleyebilir ve projelerin sürdürülebilirliğini artırır. Bu, özellikle büyük ekipler ve uzun süreli projeler için büyük bir avantajdır.
Rakip Araçlarla Karşılaştırma
PMD, Checkstyle, SonarQube gibi araçlar da kod analizi yapar, ancak Detekt, Kotlin’e özgü statik analizde çok daha derin bir entegrasyon sunar. Diğer araçlar daha geniş bir dil desteği sunarken, Detekt tamamen Kotlin’e özel yapılandırmasıyla çok daha hassas analizler yapar. Bu gibi farklılıkları daha net anlamak için Tablo 1’de Detekt ile diğer statik analiz araçlarının karşılaştırmasını inceleyelim.
Özellikler | Detekt | PMD | Checkstyle | SonarQube |
---|---|---|---|---|
Hedef Dil | Kotlin | Java, Apex, vb. | Java | Birçok dil |
Kotlin Desteği | Evet (Özel optimizasyonlar) | Hayır | Kısmi | Evet |
Statik Kod Analizi | Evet | Evet | Evet | Evet |
Stil Kontrolü | Evet | Hayır | Evet | Evet |
Entegrasyon Kolaylığı | Gradle, Maven, CI/CD araçları | Gradle, Maven | Gradle, Maven | CI/CD entegrasyonları mevcut |
CI/CD Entegrasyonu | Evet (GitHub Actions, Jenkins) | Evet | Evet | Evet |
Raporlama Formatları | HTML, XML, Plain Text | HTML, XML | HTML, XML | HTML, PDF, XML, JSON |
Özelleştirme Seçenekleri | Evet (detekt.yml ile) | Kısıtlı | Kısıtlı | Evet (GUI veya config dosyası ile) |
Topluluk ve Destek | Kotlin topluluğu odaklı | Geniş ama Java odaklı | Küçük | Geniş, ticari destek mevcut |
Kurulum Zorluğu | Kolay | Orta | Orta | Orta |
Ek Özellikler | Kotlin’e özel kurallar yazma | Kod kötü kokuları tespit etme | Stil odaklı | Detaylı metrikler ve görselleştirme |
Detekt’i Projeye Dahil Etme
Detekt, kolayca entegre olabilir. Projeye dahil etmek oldukça basittir. Aşağıdaki adımlarla kolayca yapılandırılabilir.
Gradle ile Entegrasyon
Gradle tabanlı projelere Detekt’i dahil etmek için şu adımları takip edebilirsiniz:
Eklentiyi Ekleyin
Projenizde build.gradle
dosyasına aşağıdaki satırı ekleyin:
1
2
3
plugins {
id "io.gitlab.arturbosch.detekt" version "1.23.0"
}
Konfigürasyonu Yapılandırın
Projenizin kök dizininde bir detekt.yml
dosyası oluşturarak, Detekt’in kurallarını özelleştirebilirsiniz. Ayrıca
raporları HTML ve XML formatında oluşturmak için şu şekilde yapılandırabilirsiniz:
1
2
3
4
5
6
7
detekt {
config = files("detekt.yml") // Projeye özel kurallar için
reports {
html.required.set(true) // HTML raporu oluştur
xml.required.set(true) // XML raporu oluştur
}
}
Detekt’i Çalıştırın
Gradle üzerinden Detekt’i çalıştırmak için şu komutu kullanabilirsiniz:
1
./gradlew detekt
Detekt ile Kod Kurallarını Özelleştirme
Detekt ile varsayılan kuralların dışında projeye özel kurallar oluşturabilirsiniz. detekt.yml
dosyasında
değişiklikler yaparak kodunuzun ihtiyaçlarına uygun kontrolleri ekleyebilirsiniz.
Örnek Özelleştirilmiş Kurallar
Özelleştirilmiş kurallar, takımınızın veya projenizin kod standartlarına tam uyum sağlayacak şekilde yapılandırılabilir.
Aşağıda, farklı kuralları aktif hale getiren bir detekt.yml
örneği bulunmaktadır:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
build:
maxIssues: 45 # Maksimum 45 sorun izlenebilir
excludeCorrectable: true # Düzeltilmesi kolay hataları hariç tutar
style:
MagicNumber:
active: true # MagicNumber kuralını etkinleştir
ignoreNumbers: [ 0, 1, 2 ] # 0, 1 ve 2 sayıları yok sayılır
complexity:
LongMethod:
active: true # LongMethod kuralını etkinleştir
threshold: 50 # 50 satırı aşan metotlar uyarı verir
LargeClass:
active: true # LargeClass kuralını etkinleştir
threshold: 300 # 300 satırdan uzun sınıflar uyarı verir
naming:
VariableNaming:
active: true # Değişken ismi kontrolünü etkinleştir
maximumNameLength: 20 # Maksimum 20 karakter uzunluğunda isimler
minimumNameLength: 5 # Minimum 5 karakter uzunluğunda isimler
comments:
CommentOverPrivateMethod:
active: true # Özel metotların üzerinde açıklama kontrolünü etkinleştir
Detekt, proje ihtiyaçlarınıza daha uygun olabilecek özel kurallar yazmanıza da olanak tanır. Örneğin, boş metotları tespit etmek için aşağıdaki gibi bir özel kural yazılabilir.
Boş Metotları Tespit Etme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class EmptyMethodRule : Rule() {
override val issue: Issue = Issue(
id = "EmptyMethod",
severity = Severity.Style,
description = "Boş metotların kullanımını sınırlandırır",
debt = Debt.FIVE_MINS
)
override fun visitNamedFunction(function: KtNamedFunction) {
if (function.bodyExpression == null) {
report(CodeSmell(issue, Entity.from(function), "Metot boş olmamalı."))
}
}
}
Bu kural, proje içinde boş metotların kullanılmasını engellemeye yönelik bir uyarı verecektir.
Rule Sınıfından Miras Alma: Detekt özel kurallarınızı yazarken, Rule sınıfından miras alırsınız. visitNamedFunction Metodu: Bu metod, Kotlin fonksiyonları (metotları) üzerinde işlem yapar. Burada KtNamedFunction objesinin bodyExpression özelliği kontrol edilir. Eğer fonksiyonun gövdesi boşsa (null), bir uyarı (code smell) raporlanır. Raporlama: report(CodeSmell(…)) ile tespit edilen hatalar raporlanır.
Detekt Suppression Özelliği
Detekt’teki suppression (surpresyon) özelliği, belirli hataların veya uyarıların geçici olarak göz ardı edilmesini sağlar. Bu özellik, projede teknik borçların yönetilmesi veya özel durumlarda belirli hataların göz ardı edilmesi gerektiğinde oldukça kullanışlıdır. Suppression, analiz sırasında belirli kural ihlallerini geçici olarak yok sayarak, geliştiricilere esneklik sağlar.
Suppression Kullanma Yöntemleri
1. Kod İçinde Suppression Kullanımı
Detekt’te, belirli kuralların ihlallerini göz ardı etmek için @Suppress
anotasyonu kullanılabilir.Bu sayede, kodun
belirli bölümlerinde hataların raporlanmasını engelleyebilirsiniz. Örnek verecek olursak:
1
2
3
4
@Suppress("MagicNumber")
fun calculate() {
val pi = 3.14 // göz ardı edilir
}
Burada, @Surpress geçerek ilgili kuralı geçici olarak devre dışı bırakmış olduk.
2. Detekt Konfigürasyon Dosyasında Suppression Kullanımı
Detekt’te, detekt.yml
dosyasını kullanarak daha amaçlı suppression ayarlaması yapılabilir.
Bu sayede, ihtiyaç duyulan kuralların proje genelinde devre dışı bırakılması sağlanabilir. Örnek verecek olursak:
1
2
3
style:
MagicNumber:
active: false # kuralı devre dışı bırak
Bu sayede, kural, tüm projede etkisiz hale gelir ve bu kural ile ilgili yapılan hatalar raporlanmaz.
Suppression Kullanımının Avantajları ve Dikkat Edilmesi Gerekenler
-
Geçici Çözümler: Suppression, çoğunlukla geçici çözümlerde kullanılır. Doğru olan her zaman, suppression kullanılan kuralların yerine olması gereken düzeltmelerin yapılmasıdır.
-
Teknik Borçlar: Projelerdeki çeşitli teknik borçları yönetirken, suppression kullanarak kısa vadeli çözüm getirebilir ve daha sonra kodunuzu iyileştirebilirsiniz.
-
Dikkatli Kullanılmalı: Bu özellik bilinçsiz kullanıldığında, kod kalitesinde düşüşe sebep olabilir. Sürekli ufak hatalarda suppression kullanmak, yazılımın gelecekteki bakımını zorlaştırabilir.
CI/CD Süreçlerine Entegrasyon
Detekt, kod kalitesini sürekli izlemek için CI/CD(sürekli entegrasyon/sürekli teslim ve dağıtım) süreçlerine entegre edilebilir. Bu entegrasyonlar, her yeni değişiklikte otomatik olarak kod analizi yaparak hataların erken aşamalarda tespit edilmesini sağlar.
GitHub Actions Entegrasyonu
GitHub Actions kullanarak Detekt’i çalıştırmak için aşağıdaki adımları izleyebilirsiniz:
1
2
3
4
5
6
7
jobs:
detekt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Detekt Çalıştır
run: ./gradlew detekt
Jenkins Pipeline Entegrasyonu
Jenkins üzerinde Detekt’i çalıştırmak için şu pipeline(işlem hattı) yapılandırmasını kullanabilirsiniz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Run Detekt') {
steps {
sh './gradlew detekt'
}
}
}
}
Detekt Raporlama Özellikleri
Detekt, kod analizini yaptıktan sonra elde edilen sonuçları farklı formatlarda raporlayabilir. Detekt, raporları HTML, XML ve düz metin (plain text) gibi çeşitli formatlarda olabilir.
Raporlama Formatları
1. HTML Raporları
Detekt, analiz sonuçlarını HTML formatında oluşturabilir. Bu raporlar görsel olarak daha anlaşılırdır. Hataların ve uyarıların detaylarına rahatça ulaşılabilir.
2. XML Raporları
Detekt, XML formatında da raporlar üretir. Bu format genellikle CI/CD süreçlerinde kullanılır ve hata takibi için uygundur.
3. Düz Metin Raporları
Düz metin formatındaki raporlar, özellikle basit yapılandırmalar veya yazılımın daha az karmaşık olduğu durumlar için uygundur.
Raporları Özelleştirme
Detekt, rapor formatlarını ve içeriğini özelleştirmenize olanak sağlar. Konfigürasyon dosyanızda raporların hangi formatlarda oluşturulacağını belirtebilirsiz.
1
2
3
4
5
6
7
detekt {
config = files("detekt.yml") // Projeye özel konfigürasyon dosyası
reports {
html.required.set(true) // HTML raporu oluşturulacak
xml.required.set(true) // XML raporu oluşturulacak
}
}
Raporları CI/CD Süreçlerine Dahil Etme
Detekt, CI/CD süreçlerine entegre edilebilir ve bu sayede her kod değişikliğinde otomatik olarak analiz raporları üretilebilir. Böylece yazılım geliştirme sürecinde hata tespiti ve düzeltme hızlanır. Detekt raporları, CI/CD sistemlerinde test sonuçları ile birlikte arşivlenebilir ve analiz edilebilir.
Sonuç
Detekt ve benzeri araçlar, yazılım projelerinin sürdürülebilirliğini ve başarısını doğrudan etkileyebilir. Kod kalitesini artırmanın sadece hata tespitini yapmakla değil, aynı zamanda yazılımın bakımını kolaylaştırmakla da ilgili olduğunu bilmek gerekir. Detekt’in sunduğu esneklik ve özelleştirme seçenekleri, projelere özel kurallar ekleyerek, her ekibin kendi ihtiyaçlarına göre kod standartları oluşturmasına olanak tanır.
Yazımızın teknik gözden geçirmesi için Muhsin Özbek’e, editör desteği için ise Beyza Şenel’e teşekkür ederiz.
Kaynakça