Saya baru mengenal analisis kode statis. Aplikasi saya memiliki kompleksitas Siklomatis 17.754. Aplikasi itu sendiri hanya 37.672 baris kode. Apakah valid untuk mengatakan bahwa kompleksitasnya tinggi berdasarkan pada baris kode? Apa sebenarnya yang dikatakan kompleksitas Cyclomatic kepada saya?
metrics
cyclomatic-complexity
AngryBird
sumber
sumber
Jawaban:
Kompleksitas siklon bukanlah ukuran garis kode, tetapi jumlah jalur independen melalui modul. Kompleksitas siklomatik Anda sebesar 17,754 berarti bahwa aplikasi Anda memiliki 17,754 jalur unik melewatinya. Ini memiliki beberapa implikasi, biasanya dalam hal seberapa sulit untuk memahami dan menguji aplikasi Anda. Sebagai contoh, kompleksitas siklomatik adalah jumlah kasus uji yang diperlukan untuk mencapai cakupan cabang 100%, dengan asumsi tes yang ditulis dengan baik.
Titik awal yang baik mungkin artikel Wikipedia tentang kompleksitas siklomatik . Ini memiliki beberapa potongan pseudocode dan beberapa grafik yang menunjukkan apa itu kompleksitas siklomatik. Jika Anda ingin tahu lebih banyak, Anda juga bisa membaca makalah McCabe di mana ia mendefinisikan kompleksitas siklomatik .
Tidak semuanya. Aplikasi dengan beberapa baris kode dan sejumlah besar kondisional yang bersarang dalam loop dapat memiliki kompleksitas siklomatik yang sangat tinggi. Di sisi lain, aplikasi dengan beberapa kondisi mungkin memiliki kompleksitas siklomatik yang rendah. Itu terlalu menyederhanakan masalah besar, tapi saya pikir ini bisa membuat ide.
Tanpa mengetahui lebih lanjut tentang apa yang dilakukan aplikasi Anda, mungkin normal untuk memiliki kompleksitas siklomatik yang lebih tinggi. Saya menyarankan mengukur kompleksitas siklomatik pada tingkat kelas atau metode, bukan hanya tingkat aplikasi. Ini sedikit lebih mudah dikelola, secara konseptual, saya pikir - lebih mudah untuk memvisualisasikan atau mengkonseptualisasikan jalur melalui metode daripada jalur melalui aplikasi besar.
sumber
Kompleksitas cyclomatic adalah cara untuk menentukan apakah kode Anda perlu di refactored. Kode dianalisis dan angka kerumitan ditentukan. Kompleksitas ditentukan dengan bercabang (jika pernyataan, dll.) Kompleksitas juga dapat memperhitungkan perhitungan loop, dll. Dan faktor-faktor lain tergantung pada algoritma yang digunakan.
Angka tersebut berguna pada level metode. Pada level yang lebih tinggi itu hanya angka.
Sejumlah 17.754 menunjukkan kompleksitas tingkat proyek (kode total), yang tidak memiliki banyak makna.
Mengebor kompleksitas tingkat kelas dan metode akan menentukan area kode yang perlu dire-refoured menjadi metode yang lebih kecil atau dirancang ulang untuk menghilangkan kompleksitas.
Pertimbangkan satu
CASE
pernyataan dengan 50 kasus dalam satu metode. Mungkin setiap negara memiliki logika bisnis yang berbeda. Itu akan menghasilkan kompleksitas siklomatik 50. Ada 50 poin keputusan. Pernyataan CASE mungkin harus dirancang ulang menggunakan pola pabrik untuk menyingkirkan logika percabangan. Kadang-kadang Anda dapat melakukan refactor (memecah metode menjadi bagian-bagian yang lebih kecil) dan dalam beberapa kasus hanya mendesain ulang akan mengurangi kompleksitas.Secara umum, untuk kompleksitas tingkat metode:
Juga pertimbangkan bahwa kompleksitas yang lebih tinggi membuat kode lebih sulit untuk unit test.
Kompleksitas tertinggi yang saya lihat pada metode tunggal adalah 560. Itu sekitar 2000 baris pernyataan if dalam satu metode. Pada dasarnya unmaintainable, unestable, penuh bug potensial. Bayangkan semua kasus uji unit yang diperlukan untuk logika percabangan itu! Tidak baik.
Coba dan simpan semua metode di bawah 20 dan sadari bahwa ada biaya untuk refactoring metode apa pun untuk membuatnya lebih kompleks.
sumber
Ini adalah jumlah jalur berbeda di aplikasi Anda. Lihat artikel IBM ini di CC .
Tampaknya tinggi tetapi dalam kasus Anda itu adalah penambahan CC dari semua metode Anda dari semua kelas dan metode Anda. Contoh saya jauh meluas karena saya tidak tahu bagaimana kode Anda terstruktur tetapi Anda mungkin juga memiliki satu metode monster dengan 37672 baris kode atau 3767 metode dengan sekitar 10 baris kode. Yang saya maksudkan adalah bahwa pada level aplikasi, indikator ini tidak banyak berarti, tetapi pada level metode itu dapat membantu Anda mengoptimalkan / menulis ulang kode Anda menjadi metode yang lebih kecil sehingga mereka lebih rentan terhadap kesalahan.
Yang sering saya baca secara pribadi adalah bahwa metode dengan CC lebih tinggi dari 10 memiliki risiko cacat lebih tinggi.
Saya menggunakan Sonar untuk menguji kualitas kode aplikasi saya dan secara default saya pikir itu memunculkan peringatan jika Anda memiliki metode dengan +10 CC. Namun itu mungkin tidak berarti apa-apa. Salah satu contoh nyata: jika Anda menggunakan Eclipse untuk menghasilkan
equals
metode berdasarkan sifat kacang Anda, CC akan dengan cepat naik di atas atap ...sumber
equals
metode yang dihasilkan .Itu tergantung pada alat mana yang Anda gunakan. Beberapa alat open source di luar sana mengambil kelas sebagai modul atau tingkat struktur lainnya sebagai modul. Oleh karena itu, semakin besar suatu proyek, semakin tinggi Kompleksitas Cyclomatik yang didapatnya. Namun, untuk pemahaman pribadi saya, itu harus berdasarkan fungsi. Karena semakin besar proyek yang didapat, fungsi yang dihadapinya harus dimiliki.
Saya sarankan Anda untuk menggunakan alat yang disebut Kadal dan Anda dapat menemukan kode sumber daya dan mengunduh file zip di github. Ini juga memiliki versi online jika tidak ada banyak informasi rahasia dalam kode Anda.
CCN bermakna yang harus Anda perhatikan adalah pada basis fungsi selain yang lain. Selain itu, menjaga CCN setiap fungsi tetap 15 akan menjadi kisaran ideal.
sumber