Beberapa komentar tentang ini yang saya iseng tulis ...
Khususnya, untuk persamaan Wikipedia M = E - N + 2P
Persamaan itu sangat salah .
Untuk beberapa alasan, McCabe memang menggunakannya dalam makalah aslinya ("Ukuran Kompleksitas", Transaksi IEEE pada Rekayasa Perangkat Lunak, Vo. SE-2, No.4, Desember 1976), tetapi tanpa membenarkannya dan setelah benar-benar mengutip yang benar rumus di halaman pertama, yaitu
v (G) = e - v + p
(Di sini, elemen rumus telah dilabel ulang)
Secara khusus, McCabe merujuk buku C.Berge, Graphs dan Hypergraphs (disingkat menjadi G&HG). Langsung dari buku itu :
Definisi (halaman 27 di bawah G&HG):
Angka siklomatik v (G) dari grafik G (tidak terarah) (yang mungkin memiliki beberapa komponen yang terputus) didefinisikan sebagai:
v (G) = e - v + p
di mana e = jumlah tepi, v = jumlah simpul, p = jumlah komponen yang terhubung
Teorema (halaman 29 di atas G&HG) (tidak digunakan oleh McCabe):
Angka siklomatik v (G) dari grafik G sama dengan jumlah maksimum siklus independen
Sebuah siklus adalah urutan simpul mulai dan berakhir pada simpul yang sama, dengan masing-masing dua simpul berturut-turut di urutan berdekatan satu sama lain dalam grafik.
Secara intuitif, sebuah set siklus adalah independen jika tidak ada siklus dapat dibangun dari yang lain dengan melapiskan lapisan.
Teorema (halaman 29 tengah G&HG) (sebagaimana digunakan oleh McCabe):
Dalam grafik G yang sangat terhubung, angka siklomatik sama dengan jumlah maksimum dari sirkuit bebas linear.
Sebuah sirkuit adalah siklus tanpa pengulangan simpul dan tepi diperbolehkan.
Grafik terarah dikatakan sangat terhubung jika setiap titik dapat dicapai dari setiap titik lainnya dengan melewati tepi sesuai arah yang ditentukan.
Perhatikan bahwa di sini kami beralih dari grafik tidak terarah ke grafik yang sangat terhubung (yang diarahkan ... Berge tidak membuat ini sepenuhnya jelas)
McCabe sekarang menerapkan teorema di atas untuk memperoleh cara sederhana untuk menghitung "Nomor Kompleksitas McCabe" (CCN) sebagai berikut:
Diberikan grafik terarah yang mewakili "lompat topologi" dari suatu prosedur (grafik aliran instruksi), dengan titik yang ditunjuk mewakili titik masuk yang unik dan titik yang ditunjuk mewakili titik keluar yang unik (titik titik keluar mungkin perlu "dibangun" dengan menambahkannya jika ada beberapa pengembalian), buat grafik yang sangat terhubung dengan menambahkan tepi terarah dari titik keluar titik ke titik masuk titik, sehingga membuat titik masuk titik terjangkau dari titik lain.
McCabe sekarang berpendapat (agak membingungkan saya bisa mengatakan) bahwa angka siklomatik dari grafik aliran instruksi yang dimodifikasi "sesuai dengan gagasan intuitif kami tentang 'jumlah minimum lintasan'", dan karenanya kami akan menggunakan angka itu sebagai ukuran kompleksitas.
Keren, jadi:
Jumlah kompleksitas siklomatik dari grafik aliran instruksi yang dimodifikasi dapat ditentukan dengan menghitung sirkuit "terkecil" dalam grafik yang tidak diarahkan. Ini tidak terlalu sulit dilakukan oleh manusia atau mesin, tetapi menerapkan teorema di atas memberi kita cara yang lebih mudah untuk menentukannya:
v (G) = e - v + p
jika seseorang mengabaikan directionality of the edge.
Dalam semua kasus, kami hanya mempertimbangkan satu prosedur tunggal, jadi hanya ada satu komponen yang terhubung di seluruh grafik, dan karenanya:
v (G) = e - v + 1.
Dalam hal seseorang mempertimbangkan grafik asli tanpa menambahkan tepi "keluar-ke-entri" , ia memperoleh:
ṽ (G) = ẽ - v + 2
sebagai ẽ = e - 1
Mari kita ilustrasikan dengan menggunakan contoh McCabe dari makalahnya:
Di sini kita memiliki:
- e = 10
- v = 6
- p = 1 (satu komponen)
- v (G) = 5 (kami jelas menghitung 5 siklus)
Rumus untuk nomor siklomatik mengatakan:
v (G) = e - v + p
yang menghasilkan 5 = 10 - 6 +1 dan benar!
"Nomor kompleksitas siklomatik McCabe" seperti yang diberikan dalam makalahnya adalah
5 = 9 - 6 + 2 (tidak ada penjelasan lebih lanjut diberikan dalam makalah tentang bagaimana)
yang kebetulan benar (menghasilkan v (G)) tetapi karena alasan yang salah, yaitu kita menggunakan:
ṽ (G) = ẽ - v + 2
dan karenanya ṽ (G) = v (G) ... Fiuh!
Tetapi apakah ukuran ini bagus?
Dalam dua kata: Tidak terlalu
- Tidak sepenuhnya jelas bagaimana menetapkan "grafik aliran instruksi" dari suatu prosedur, terutama jika penanganan pengecualian dan rekursi masuk dalam gambar. Perhatikan bahwa McCabe menerapkan idenya ke kode yang ditulis dalam FORTRAN 66 , sebuah bahasa tanpa rekursi, tanpa pengecualian dan struktur eksekusi langsung.
- Fakta bahwa prosedur dengan keputusan dan prosedur dengan loop menghasilkan CCN yang sama bukanlah pertanda baik.