Elif Çavent
Yazılım Geliştirme Uzmanı

Detekt ile Kod Kalitesini Artırma

Detekt ile Kod Kalitesini Artırma

İçindekiler

  1. Detekt Nedir?
  2. Neden Detekt?
    1. Erken Tespit
    2. Okunabilirlik
    3. Ekip Uyumu
    4. Zaman ve Maliyet Tasarrufu
    5. Kod Kalitesini Sürekli İzleme
  3. Rakip Araçlarla Karşılaştırma
  4. Detekt’i Projeye Dahil Etme
    1. Gradle ile Entegrasyon
  5. Detekt ile Kod Kurallarını Özelleştirme
  6. Detekt Suppression Özelliği
    1. Suppression Kullanma Yöntemleri
      1. 1. Kod İçinde Suppression Kullanımı
      2. 2. Detekt Konfigürasyon Dosyasında Suppression Kullanımı
    2. Suppression Kullanımının Avantajları ve Dikkat Edilmesi Gerekenler
  7. CI/CD Süreçlerine Entegrasyon
    1. GitHub Actions Entegrasyonu
    2. Jenkins Pipeline Entegrasyonu
  8. Detekt Raporlama Özellikleri
  9. Sonuç
  10. 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
Tablo 1. Detekt ile diğer statik analiz araçlarının karşılaştırması

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

  1. Detekt Resmi Dokümantasyonu
  2. Detekt Rehberi: Kotlin için Statik Kod Analizi
  3. detekt/detekt: Static code analysis for Kotlin ** **