Apa yang dimaksud dengan 'kompleksitas siklomatik' dari kode saya?

42

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?

AngryBird
sumber
Itu sepenuhnya tergantung pada apa yang Anda lakukan. Jika Anda mencoba melakukan sesuatu yang sederhana, maka itu sangat, sangat tinggi. Anda seharusnya tidak memiliki rasio itu di "hello world", misalnya.
cwallenpoole

Jawaban:

48

Apa sebenarnya yang dikatakan kompleksitas Cyclomatic kepada saya?

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 .

Aplikasi saya memiliki kompleksitas Siklomatik 17.754 baris kode. Aplikasi itu sendiri hanya 37.672 baris kode. Apakah valid untuk mengatakan bahwa kerumitannya berdasarkan pada baris kode?

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.

Thomas Owens
sumber
36

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 CASEpernyataan 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:

  • <10 Mudah dirawat
  • 11-20 Sulit dipertahankan
  • 21+ Kandidat untuk refactoring / mendesain ulang

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.

Jon Raynor
sumber
Ini jawaban yang lebih baik.
Pacerier
2
@Pacerier Dalam hal ini, cukup jawablah jawabannya;).
Zero3
> "Secara umum, untuk kompleksitas tingkat metode" Kutipan?
Benny Bottema
Salah satu aplikasi asli McCabe adalah membatasi kompleksitas rutinitas selama pengembangan program; dia merekomendasikan bahwa programmer harus menghitung kompleksitas modul yang mereka kembangkan, dan membaginya menjadi modul yang lebih kecil setiap kali kompleksitas siklomatik dari modul melebihi 10.
Jon Raynor
"Pernyataan CASE mungkin harus dirancang ulang menggunakan pola pabrik untuk menyingkirkan logika percabangan." Mengapa? Itu tidak menghilangkan kompleksitas logika; itu hanya menyembunyikannya dan membuatnya kurang terlihat, dan karenanya lebih sulit untuk dipelihara.
Mason Wheeler
1

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 equalsmetode berdasarkan sifat kacang Anda, CC akan dengan cepat naik di atas atap ...

Jalayn
sumber
1
Pengaturan standar PMD adalah untuk mengingatkan pada kompleksitas siklomatik 10, juga. Melihat kompleksitas pada tingkat per-metode juga memungkinkan Anda untuk mengabaikan metode yang mungkin memiliki alasan bagus untuk CC tinggi, seperti equalsmetode yang dihasilkan .
Thomas Owens
Saya tidak yakin jadi saya memeriksa, tetapi Sonar secara internal menggunakan PMD untuk mendapatkan ukuran ini. Jadi semuanya masuk akal :-)
Jalayn
-1

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.

Jiahang Li
sumber