Kisaran Kompleksitas Siklomatik [ditutup]

27

Apa kategori kompleksitas siklomatik? Sebagai contoh:

1-5: mudah untuk mempertahankan
6-10: sulit
11-15: sangat sulit
20+: mendekati tidak mungkin

Selama bertahun-tahun sekarang, saya telah pergi dengan asumsi bahwa 10 adalah batasnya. Dan apa pun di luar itu buruk. Saya menganalisis solusi, dan saya mencoba menentukan kualitas kode. Tentu saja kompleksitas siklomatik bukan satu-satunya pengukuran, tetapi dapat membantu. Ada metode dengan kerumitan siklomatik 200+. Saya tahu itu mengerikan, tetapi saya ingin tahu tentang kisaran yang lebih rendah, seperti dalam contoh saya di atas.

Saya menemukan ini :

Nilai referensi yang disebutkan dari Carnegie Mellon menentukan empat rentang kasar untuk nilai kompleksitas siklomatik:

  • metode antara 1 dan 10 dianggap sederhana dan mudah dipahami
  • nilai antara 10 dan 20 menunjukkan kode yang lebih kompleks, yang mungkin masih dapat dipahami; Namun pengujian menjadi lebih sulit karena semakin banyak cabang yang mungkin diambil oleh kode
  • nilai 20 dan di atas adalah tipikal kode dengan sejumlah besar jalur eksekusi potensial dan hanya dapat dipahami dan diuji sepenuhnya dengan kesulitan dan upaya besar
  • metode yang bahkan lebih tinggi, misalnya> 50, tentu saja tidak dapat dipelihara

Saat menjalankan metrik kode untuk solusi, hasilnya menunjukkan warna hijau untuk apa pun di bawah 25. Saya tidak setuju dengan ini, tetapi saya berharap untuk mendapatkan input lain.

Apakah ada daftar rentang yang diterima secara umum untuk kompleksitas siklomatik?

Bob Horn
sumber
2
Anda menemukan data dari Institut Rekayasa Perangkat Lunak, sebuah organisasi yang diakui sebagai pemimpin dalam rekayasa perangkat lunak. Saya tidak mengerti apa pertanyaan Anda - Anda menemukan daftar rentang untuk kompleksitas siklomatik. Apa lagi yang kamu cari?
Thomas Owens
1
Saya telah melihat berbagai rentang; itu hanya satu contoh. Dan MS menunjukkan "hijau" untuk apa pun di bawah 25. Saya bertanya-tanya apakah ada satu daftar rentang yang diterima. Mungkin saya sudah menemukannya saat itu.
Bob Horn
1
Saya setuju dengan @ThomasOwens, tapi saya senang Anda menanyakan pertanyaan ini. Saya mengangkatnya sebagai pertanyaan dan jawaban.
Evorlor
1
Dalam Edisi Lengkap dari Steve McConnell's Code Complete, ia merekomendasikan bahwa kompleksitas siklomatik dari 0 hingga 5 biasanya baik-baik saja, tetapi Anda harus waspada jika kompleksitasnya mulai dalam kisaran 6 hingga 10. Dia lebih jauh menjelaskan bahwa apa pun di atas kompleksitas 10 Anda harus sangat mempertimbangkan refactoring kode Anda.
Gibbo

Jawaban:

19

Saya kira itu tergantung pada kemampuan staf pemrograman Anda, dan tidak sedikit pada kepekaan Anda sebagai seorang manajer.

Beberapa programmer adalah pendukung setia TDD, dan tidak akan menulis kode apa pun tanpa menulis unit test terlebih dahulu. Pemrogram lain sangat mampu membuat program yang bebas bug dengan baik, tanpa menulis satu unit test. Tingkat kompleksitas siklomatik yang dapat ditoleransi setiap kelompok hampir pasti akan sangat bervariasi.

Ini adalah metrik subjektif; mengevaluasi pengaturan pada solusi Metrik Kode Anda, dan menyesuaikannya dengan sweet spot yang membuat Anda merasa nyaman dengan yang memberi Anda hasil yang masuk akal.

Robert Harvey
sumber
3
Setuju, apalagi itu tergantung pada apa penyebab kompleksitasnya. Pernyataan peralihan besar yang memanggil fungsi-fungsi lain, sebagai bagian dari mesin negara atau sesuatu yang serupa, dapat memiliki kompleksitas yang sangat tinggi, meskipun mungkin hampir sepele untuk dipahami.
whatsisname
1
Bukankah pernyataan peralihan besar biasanya merupakan indikasi kurangnya prinsip OOP, seperti polimorfisme? Mesin negara dapat diimplementasikan dengan cara yang elegan, dengan OOP atau pola desain. Tidak?
Bob Horn
3
Untuk beberapa masalah yang 'keanggunan' berguna, bagi orang lain itu hanya membuat segalanya lebih membingungkan. Tidak ada peluru perak.
whatsisname
1
-1 Untuk "Pemrogram lain sangat mampu membuat program bebas bug yang bagus, tanpa menulis satu unit test." Anda tidak dapat mengetahui bug gratis jika Anda belum mengujinya.
Sebastien
1
@ Sebastien: Tidak adanya unit test tidak berarti tidak diuji. Dan ya, jika Anda cukup baik, sangat mungkin untuk menulis kode bebas bug tanpa tes atau tes asap yang belum sempurna. Diakui, orang-orang itu adalah jenis langka.
Robert Harvey
10

Tidak ada kategori yang telah ditentukan dan tidak ada kategorisasi karena beberapa alasan:

  1. Beberapa teknik refactoring hanya memindahkan kompleksitas dari satu titik ke titik lain (bukan dari kode Anda ke kerangka kerja atau pustaka eksternal yang telah teruji dengan baik, tetapi dari satu lokasi ke lokasi lain dari basis kode). Ini membantu mengurangi kompleksitas siklomatik dan membantu meyakinkan atasan Anda (atau siapa pun yang menyukai presentasi dengan grafik yang terus meningkat) bahwa Anda menghabiskan waktu Anda untuk membuat sesuatu yang hebat, tetapi kode tetap seburuk sebelumnya.

  2. Sebaliknya, kadang-kadang, ketika Anda melakukan refactor suatu proyek dengan menerapkan beberapa pola desain dan pemrograman, kompleksitas cyclomatic bisa menjadi lebih buruk, sementara kode yang di-refactored diharapkan menjadi jelas: pengembang tahu pola pemrograman (setidaknya mereka diharapkan mengetahuinya), jadi itu menyederhanakan kode untuk mereka, tetapi kompleksitas cyclomatic tidak memperhitungkan ini.

  3. Beberapa teknik non-refactoring lainnya tidak mempengaruhi kompleksitas siklomatik sama sekali, sementara sangat mengurangi kompleksitas kode untuk pengembang. Contoh: menambahkan komentar atau dokumentasi yang relevan. "Memodernisasi" kode dengan menggunakan gula sintaksis.

  4. Ada beberapa kasus di mana kompleksitas siklomatik tidak relevan. Saya suka contoh yang diberikan oleh whatsisname dalam komentarnya : beberapa switchpernyataan besar bisa sangat jelas dan menulis ulang dengan cara yang lebih OOP tidak akan sangat berguna (dan akan mempersulit pemahaman kode oleh pemula). Pada saat yang sama, pernyataan-pernyataan itu adalah bencana, dari segi kompleksitas siklisomatik.

  5. Seperti Robert Harvey katakan di atas , itu tergantung pada tim itu sendiri.

Dalam prakteknya, saya telah melihat kode sumber yang memiliki kompleksitas siklomatik yang baik, tetapi yang mengerikan. Pada saat yang sama, saya telah melihat kode dengan kompleksitas siklomatik yang tinggi, tetapi saya tidak terlalu kesulitan memahaminya.

Hanya saja tidak ada dan tidak bisa menjadi alat apa pun yang akan menunjukkan, tanpa cacat, seberapa baik atau buruk sepotong kode yang diberikan atau betapa mudahnya mempertahankannya . Karena Anda tidak dapat memprogram aplikasi yang akan memberi tahu bahwa lukisan yang diberikan adalah sebuah mahakarya, dan yang lainnya harus dibuang, karena tidak memiliki nilai artistik.

Ada metrik yang rusak oleh desain (seperti LOC atau jumlah komentar per file), dan ada metrik yang dapat memberikan beberapa petunjuk mentah (seperti jumlah bug atau kompleksitas siklomatik). Dalam semua kasus, itu hanyalah petunjuk, dan harus digunakan dengan hati-hati.

Arseni Mourzenko
sumber
2
+1 Saya setuju dengan semua yang dikatakan. Kompleksitas siklomatik atau LOC hanyalah metrik yang diserahkan kepada Anda dengan analisis kode statis. Analisis statis adalah alat yang hebat, tetapi tidak memiliki akal sehat. Metrik ini perlu diproses oleh otak manusia, lebih disukai yang dimiliki oleh programmer yang berpengalaman. Hanya dengan begitu Anda dapat mengetahui apakah suatu perangkat lunak tertentu tidak perlu rumit.