CK menghitung metrik kode tingkat kelas dan tingkat dalam proyek Java dengan menggunakan analisis statis (yaitu tidak perlu kode yang dikompilasi). Saat ini, berisi satu set metrik besar, termasuk CK yang terkenal:
CBO (kopling antar objek) : menghitung jumlah dependensi yang dimiliki kelas. Alat memeriksa jenis apa pun yang digunakan di seluruh kelas (Deklarasi Bidang, Jenis Pengembalian Metode, Deklarasi Variabel, dll). Itu mengabaikan ketergantungan pada Java sendiri (misalnya java.lang.string).
CBO dimodifikasi (kopling antar objek) : menghitung jumlah dependensi yang dimiliki kelas. Ini sangat mirip dengan CBO asli CKTOOL. Namun, metrik ini mempertimbangkan ketergantungan dari suatu kelas sebagai referensi yang dibuat oleh tipe untuk orang lain dan referensi yang diterimanya dari jenis lain.
Fan-in : Menghitung jumlah dependensi input yang dimiliki kelas, yaitu, jumlah kelas yang merujuk kelas tertentu. Misalnya, diberi kelas X, kipas X akan menjadi jumlah kelas yang memanggil X dengan merujuknya sebagai atribut, mengakses beberapa atributnya, memohon beberapa metodenya, dll.
Fan-out : Menghitung jumlah dependensi output yang dimiliki kelas, yaitu, jumlah kelas lain yang dirujuk oleh kelas tertentu. Dengan kata lain, diberikan kelas X, fan-out dari X adalah jumlah kelas yang disebut oleh X melalui referensi atribut, doa metode, instance objek, dll.
DIT (Pohon Warisan Kedalaman) : Ini menghitung jumlah "ayah" yang dimiliki kelas. Semua kelas memiliki DIT setidaknya 1 (semua orang mewarisi java.lang.Object). Untuk mewujudkannya, kelas harus ada dalam proyek (yaitu jika kelas tergantung pada x yang bergantung pada file toples/ketergantungan, dan X tergantung pada kelas lain, DIT dihitung sebagai 2).
NOC (Jumlah Anak) : Ini menghitung jumlah subkelas langsung yang dimiliki kelas tertentu.
Jumlah bidang : menghitung jumlah bidang. Nomor spesifik untuk jumlah total bidang, statis, publik, pribadi, terlindungi, default, final, dan bidang yang disinkronkan.
Jumlah metode : menghitung jumlah metode. Angka spesifik untuk jumlah total metode, statis, publik, abstrak, pribadi, terlindungi, default, final, dan metode yang disinkronkan. Metode konstruktor juga dihitung di sini.
Jumlah metode yang terlihat : menghitung jumlah metode yang terlihat. Metode terlihat jika tidak pribadi.
NOSI (Jumlah doa statis) : Menghitung jumlah doa untuk metode statis. Itu hanya dapat menghitung yang dapat diselesaikan oleh JDT.
RFC (Respons untuk Kelas) : Menghitung jumlah invokasi metode unik di kelas. Ketika doa diselesaikan melalui analisis statis, implementasi ini gagal ketika metode memiliki kelebihan dengan jumlah parameter yang sama, tetapi jenis yang berbeda.
WMC (kelas metode berat) atau kompleksitas McCabe . Ini menghitung jumlah instruksi cabang di kelas.
LOC (baris kode) : Ini menghitung baris hitungan, mengabaikan baris dan komentar kosong (yaitu, ini adalah sumber baris kode, atau sloc). Jumlah baris di sini mungkin sedikit berbeda dari file asli, karena kami menggunakan representasi internal JDT dari kode sumber untuk menghitungnya.
LCOM (Kurangnya kohesi metode) : Menghitung metrik LCOM. Ini adalah versi metrik pertama, yang tidak dapat diandalkan. LCOM-HS bisa lebih baik (semoga, Anda akan mengirimkan permintaan tarik kepada kami).
LCOM* (Kurangnya kohesi metode) : Metrik ini adalah versi yang dimodifikasi dari versi LCOM saat ini yang diimplementasikan dalam alat CK. LCOM* adalah metrik yang dinormalisasi yang menghitung kurangnya kohesi kelas dalam kisaran 0 hingga 1. Kemudian, semakin dekat ke 1 nilai LCOM* dalam suatu kelas, semakin sedikit tingkat kohesi kelas ini masing -masing. Semakin dekat ke 0 nilai LCOM* di kelas, paling banyak kohesi dari kelas ini masing -masing. Implementasi ini mengikuti versi ketiga LCOM* yang didefinisikan dalam [1].
TCC (Kohesi Kelas Ketat) : Mengukur kohesi kelas dengan kisaran nilai dari 0 hingga 1. TCC mengukur kohesi kelas melalui koneksi langsung antara metode yang terlihat, dua metode atau pohon doa mereka mengakses variabel kelas yang sama.
LCC (Kohesi Kelas Longgar) : Mirip dengan TCC tetapi lebih lanjut mencakup jumlah koneksi tidak langsung antara kelas yang terlihat untuk perhitungan kohesi. Dengan demikian, kendala LCC> = TCC selalu berlaku.
Jumlah Pengembalian : Jumlah instruksi return .
Jumlah loop : Jumlah loop (yaitu, untuk, sementara, lakukan sementara, ditingkatkan untuk).
Kuantitas perbandingan : Jumlah perbandingan (yaitu, == dan! =). Catatan:! = Hanya tersedia di 0.4.2+.
Kuantitas Coba/Tangkapan : Jumlah Coba/Catches
Kuantitas ekspresi tanda kurung : Jumlah ekspresi di dalam tanda kurung.
Literal string : Jumlah string literal (misalnya, "John Doe" ). String berulang dihitung sebanyak yang muncul.
Jumlah Angka : Jumlah angka (yaitu, int, panjang, ganda, mengapung) literal.
Kuantitas Operasi Matematika : Jumlah Operasi Matematika (Waktu, Bagi, Sisa, Ditambah, Minus, Sialan Kiri, Pergeseran Kanan).
Jumlah variabel : Jumlah variabel yang dinyatakan.
Max Nested Blocks : Jumlah blok tertinggi bersarang.
Jumlah kelas anonim, kelas dalam, dan ekspresi lambda : nama mengatakan semuanya. Perhatikan bahwa setiap kali kelas anonim atau kelas dalam dinyatakan, itu menjadi "seluruh kelas baru", misalnya, CK menghasilkan AB dan AB $ C, C menjadi kelas dalam di dalam AB namun, ekspresi Lambda tidak dianggap sebagai kelas, dan dengan demikian, adalah bagian dari kelas/metode yang mereka tertanam. Kelas atau metode hanya memiliki jumlah kelas dalam yang dinyatakan pada levelnya, misalnya, kelas dalam yang dinyatakan di dalam metode M2, yang ada di dalam kelas A anonim, yang dinyatakan di dalam metode M, yang akhirnya dinyatakan di dalam kelas C, tidak akan dihitung di Kelas C, tetapi hanya dalam Metode M2 (metode level pertama yang diwah-dewan itu), dan anonimnya), dan anonim.
Jumlah kata unik : Jumlah kata unik dalam kode sumber. Pada level metode, hanya menggunakan badan metode sebagai input. Pada tingkat kelas, ia menggunakan seluruh tubuh kelas sebagai metrik. Algoritma pada dasarnya menghitung jumlah kata dalam metode/kelas, setelah menghapus kata kunci Java. Nama dibagi berdasarkan casing unta dan garis bawah (misalnya, longname_likethis menjadi empat kata). Lihat kelas WordCounter untuk detail tentang implementasi.
Jumlah pernyataan log : Jumlah pernyataan log dalam kode sumber. Penghitungan menggunakan Regex yang kompatibel dengan panggilan API SLF4J dan LOG4J. Lihat NumberOfLogStatements.java dan contoh uji ( NumberOfLogStatementsTest dan fixtures/logs ) untuk info lebih lanjut.
Memiliki Javadoc : Boolean yang menunjukkan apakah suatu metode memiliki Javadoc. (Hanya di tingkat metode untuk saat ini)
Pengubah : Pengubah Kelas/Metode Publik/Abstrak/Pribadi/Protect/Native. Dapat didekodekan menggunakan org.eclipse.jdt.core.dom.Modifier .
Penggunaan setiap variabel : Seberapa sering setiap variabel digunakan di dalam setiap metode.
Penggunaan masing -masing bidang : Seberapa sering setiap bidang lokal digunakan di dalam setiap metode, bidang lokal adalah bidang dalam kelas (subclass tidak termasuk). Penggunaan lapangan lokal yang tidak langsung terdeteksi, penggunaan lapangan lokal tidak langsung mencakup semua penggunaan bidang dalam pohon doa lokal dari kelas misalnya A memohon B dan B menggunakan bidang A, maka A secara tidak langsung digunakan oleh A.
Metode Invokasi : Semua metode yang dipanggil secara langsung, variasi adalah doa lokal dan doa lokal tidak langsung.
Catatan: CK memisahkan kelas, kelas dalam, dan kelas anonim. LOC adalah satu -satunya metrik yang tidak sepenuhnya terisolasi dari yang lain, misalnya, jika A memiliki deklarasi kelas B dalam, maka loc (a) = loC (kelas A) + loc (kelas B).
CK adalah alat koleksi metrik Java Code, dirampingkan menjadi struktur sederhana yang berputar di sekitar tiga paket utama:
Untuk singkatnya, dalam dokumentasi ini, awalan paket seperti com.github.mauricioaniche.ck dihilangkan.
CK mengelola orkestrasi seluruh proses pengumpulan metrik. Ini menginisialisasi pencari metrik, menangani partisi file berdasarkan memori yang tersedia, mengatur parser AST dengan pengaturan lingkungan yang sesuai, dan mengelola aliran eksekusi di berbagai direktori dan dependensi JAR. Ini secara dinamis menyesuaikan perilakunya berdasarkan input pengguna seperti useJars , maxAtOnce , dan variablesAndFields untuk mengoptimalkan pemrosesan file Java untuk koleksi metrik.ck . Kelas ini memproses argumen baris perintah untuk mengonfigurasi dan meluncurkan proses pengumpulan metrik. Ini menangani input pengguna untuk jalur proyek, inklusi jar, partisi file, perincian metrik, dan pengaturan direktori output. Runner mengatur eksekusi keseluruhan dengan menginisialisasi dan memanfaatkan kelas CK dan menangani output hasil melalui ResultWriter .FileASTRequestor , komponen inti Eclipse JDT (Java Development Tools). Ini memainkan peran penting dalam kerangka kerja CK dengan mengatur proses pengumpulan metrik. MetricsExecutor mengoordinasikan pembuatan pohon sintaks abstrak (AST) untuk file sumber Java, yang sangat penting untuk menganalisis dan mengekstraksi metrik kode. MetricsFinder: Kelas utilitas ini, yang terletak di ck.utils , memainkan peran penting dalam identifikasi dinamis dan instantiasi kelas kolektor metrik dalam kerangka kerja CK. Ini menargetkan kelas yang mengimplementasikan antarmuka ClassLevelMetric dan MethodLevelMetric dari paket metrics .
MetricsFinder menggunakan pustaka Reflections untuk memindai dan memuat kelas kolektor metrik saat runtime, yang memungkinkan sistem CK dapat diperluas dan dapat disesuaikan dengan metrik baru tanpa memerlukan modifikasi pada arsitektur inti. Fitur ini sangat berguna untuk mengintegrasikan metrik khusus ke dalam proses analisis dengan mulus.
CKVISITOR: Komponen integral dari kerangka kerja CK, CKVisitor memperluas kelas ASTVisitor yang disediakan oleh perpustakaan Eclipse JDT (Java Development Tools), memungkinkan analisis terperinci dan pengumpulan metrik langsung dari Sumber Sumber Sumber Sumber Sumber Java (AST).
Pengunjung dirancang untuk melintasi berbagai node AST, seperti jenis dan metode, dan menerapkan tindakan spesifik di setiap node. Secara efektif mengelola hierarki kelas dan metode berbasis tumpukan, yang memungkinkan metrik dihitung dan dikumpulkan dalam konteks ruang lingkup node saat ini.
CKastVisitor: Diimplementasikan oleh kelas metrik di ck.metrics , memungkinkan setiap metrik untuk menangani node AST spesifik yang menarik, seperti doa metode dan kreasi instance kelas.
ClassLevelMetric dan MethodlevelMetric: Antarmuka yang menentukan metode untuk mengumpulkan metrik tingkat kelas dan tingkat metode.
CKNotifier .CKClassResult dan CKMethodResult dengan data yang dikumpulkan.Kerangka kerja CK menggabungkan sejumlah pola desain yang mapan untuk meningkatkan modularitas, kemampuan memperpanjang, dan pemeliharaan basis kode. Pola -pola ini memungkinkan kerangka kerja untuk secara efisien menangani operasi kompleks seperti melintasi pohon sintaks abstrak (AST), mengumpulkan metrik, dan memberi tahu hasil. Di bawah ini adalah pola desain utama yang digunakan:
Pola Pengunjung: Antarmuka CKVisitor dan CKASTVisitor mengimplementasikan pola pengunjung, yang sangat penting dalam menangani operasi pada berbagai node AST tanpa mengubah kelas elemen tempat ia beroperasi. Pola ini sangat bermanfaat dalam skenario di mana komponen perlu melakukan operasi yang berbeda dan tidak terkait di seluruh hierarki kelas node AST. Ini menyederhanakan kode dengan eksternalisasi logika operasional ke dalam objek pengunjung, memfasilitasi penambahan operasi baru yang mudah tanpa memodifikasi kelas node yang ada. Pemisahan kekhawatiran ini mengarah pada basis kode yang lebih dapat dipelihara dan dapat diperluas, di mana struktur dan operasi simpul ast di atasnya dipisahkan.
POLA PEMBERITAHUAN: CK mengadopsi pola pemberitahuan melalui penggunaan CKNotifier , yang bertindak sebagai mekanisme sentral untuk menyiarkan hasil koleksi metrik kepada semua pengamat terdaftar. Pola ini sangat penting untuk menciptakan arsitektur yang digabungkan secara longgar di mana subjek (proses perhitungan metrik) tidak tergantung pada pengamatnya (prosesor hasil atau generator laporan). Ini memungkinkan CK untuk memberi tahu beberapa komponen tentang penyelesaian perhitungan metrik tanpa menggabungkan ke komponen tertentu, yang meningkatkan fleksibilitas dan skalabilitas sistem.
Pola pabrik: Instantiasi kolektor metrik dikelola oleh MetricsFinder , yang mewujudkan pola pabrik. Pola ini digunakan untuk merangkum logika kelas -kelas kolektor metrik spesifik berdasarkan keputusan runtime. Pola pabrik menyederhanakan proses penambahan jenis baru kolektor metrik tanpa mengganggu kode yang ada, memberikan arsitektur plug-and-play di mana metrik baru dapat diperkenalkan dengan mulus. Ini juga membantu dalam mempertahankan pemisahan kekhawatiran, karena proses pembuatan objek metrik diisolasi dari logika inti pengumpulan metrik.
Dengan memanfaatkan pola desain ini, CK secara efisien mengelola kompleksitas dan memastikan bahwa kerangka kerja tetap kuat, mudah beradaptasi, dan mudah diperluas sebagai persyaratan baru dan jenis metrik muncul.
Anda perlu setidaknya Java 8 untuk dapat mengkompilasi dan menjalankan alat ini.
Untuk menggunakan versi terbaru (yang seharusnya), klon proyek dan menghasilkan toples. mvn clean compile package sederhana menghasilkan file jar untuk Anda (lihat folder target Anda).
Lalu, jalankan saja:
java -jar ck-x.x.x-SNAPSHOT-jar-with-dependencies.jar
<project dir>
<use jars:true|false>
<max files per partition:0=automatic selection>
<variables and fields metrics?:true|false>
<output dir>
[ignored directories...]
Project dir mengacu pada direktori di mana CK dapat menemukan semua kode sumber yang harus diuraikan. CK akan secara rekursif mencari file .java. CK dapat menggunakan dependensi proyek untuk meningkatkan ketepatannya. Parameter use jars memberi tahu CK untuk mencari file .jar apa pun di direktori dan menggunakannya untuk menyelesaikan jenis yang lebih baik. Max files per partition memberi tahu JDT ukuran batch untuk diproses. Biarkan kami memutuskan itu untuk Anda dan mulai dengan 0; Jika masalah terjadi (yaitu, di luar memori) Anda berpikir untuk menyetelnya. Variables and field metrics menunjukkan kepada CK apakah Anda ingin metrik pada level variabel dan lapangan juga. Mereka sangat halus dan menghasilkan banyak output; Anda harus melewatkannya jika Anda hanya membutuhkan metrik di tingkat kelas atau metode. Akhirnya, output dir merujuk ke direktori di mana CK akan mengekspor file CSV dengan metrik dari proyek yang dianalisis. Secara opsional, Anda dapat menentukan angka apa pun yang diabaikan, dipisahkan oleh spasi (misalnya, build/ ). Secara default, .git dan semua folder tersembunyi lainnya diabaikan.
Alat ini akan menghasilkan tiga file CSV: kelas, metode, dan level variabel.
Belajar dengan contoh. Lihat Kelas Runner.java .
Lihat versi terbaru dari perpustakaan di lencana di awal readme ini, atau di https://mvnrepository.com/artifact/com.github.mauricioaniche/ck.
Gunakan cuplikan berikut di pom.xml Anda. Perbarui XYZ dengan versi terbaru dari alat ini (periksa mvnrepository.com atau lencana di awal file readme ini):
<!-- https://mvnrepository.com/artifact/com.github.mauricioaniche/ck -->
<dependency>
<groupId>com.github.mauricioaniche</groupId>
<artifactId>ck</artifactId>
<version>X.Y.Z</version>
</dependency>
Anda juga dapat menggunakan plugin CK Maven, yang dikembangkan oleh @JazzMuesli, yang secara otomatis menjalankan CK dalam proyek Anda. Sangat berguna bagi pengembang: https://github.com/jazzmuesli/ck-mvn-plugin.
Alat ini menggunakan perpustakaan inti JDT Eclipse di bawah kap untuk konstruksi AST. Saat ini versi kepatuhan diatur ke Java 11.
Butuh dukungan untuk versi bahasa yang lebih baru? Proses menambahkannya sangat mudah, mengingat menyumbangkan PR:
pom.xml . Anda dapat menggunakan browser repositori seperti repositori MVN untuk memudahkan proses ini.pom.xml , perbarui source dan properti target dari plugin kompiler maven yang sesuai.CK.java : [...]
ASTParser parser = ASTParser.newParser(AST.JLS11);
[...]
JavaCore.setComplianceOptions(JavaCore.VERSION_11, options);
[...]
Karena alat ini lahir untuk hanya menghitung CK ClassLevelMetrics, tetapi itu tumbuh di luar harapan saya ... Hidup itu lucu!
Tolong, gunakan entri Bibtex berikut:
@manual{aniche-ck,
title={Java code metrics calculator (CK)},
author={Maurício Aniche},
year={2015},
note={Available in https://github.com/mauricioaniche/ck/}
}
Cukup kirimkan PR! :)
Perangkat lunak ini dilisensikan di bawah lisensi Apache 2.0.