ข้อสังเกตบางอย่างเกี่ยวกับเรื่องนี้ที่ฉันเขียนขึ้นอย่างเฉยเมย ...
โดยเฉพาะสำหรับสมการวิกิพีเดียของ M = E - N + 2P
สมการที่เป็นมากผิดปกติ
ด้วยเหตุผลบางอย่าง McCabe ใช้มันจริงในกระดาษต้นฉบับของเขา("การวัดความซับซ้อน", ธุรกรรม IEEE ในวิศวกรรมซอฟต์แวร์, Vo .. SE-2, ฉบับที่ 4, ธันวาคม 1976) แต่ไม่มีเหตุผลที่เหมาะสมและหลังจากอ้างถึงความถูกต้องจริง สูตรในหน้าแรกซึ่งก็คือ
v (G) = e - v + p
(ที่นี่องค์ประกอบสูตรได้รับการติดฉลากใหม่)
โดยเฉพาะ McCabe อ้างอิงหนังสือC.Berge, กราฟและไฮเปอร์กราฟ (ตัวย่อด้านล่างเพื่อ G&HG) โดยตรงจากหนังสือเล่มนั้น :
คำจำกัดความ (หน้า 27 ด้านล่างของ G&HG):
หมายเลข cyclomatic v (G) ของกราฟ (undirected) G (ซึ่งอาจมีส่วนประกอบที่ไม่ได้เชื่อมต่ออยู่หลายตัว) ถูกกำหนดเป็น:
v (G) = e - v + p
โดยที่ e = จำนวนของขอบ, v = จำนวนของจุดยอด, p = จำนวนของส่วนประกอบที่เชื่อมต่อ
ทฤษฎีบท (หน้า 29 บนของ G&HG) (ไม่ได้ใช้โดย McCabe):
จำนวนรอบที่ v (G) ของกราฟ G เท่ากับจำนวนรอบสูงสุดที่เป็นอิสระ
วงจรเป็นลำดับของจุดเริ่มต้นและสิ้นสุดที่จุดสุดยอดเดียวกันกับแต่ละจุดสองติดต่อกันในลำดับที่อยู่ติดกับแต่ละอื่น ๆ ในกราฟ
สังหรณ์ใจชุดของวงจรมีความเป็นอิสระหากไม่มีวงจรใดที่สามารถสร้างขึ้นจากคนอื่น ๆ โดยซ้อนทับเดิน
ทฤษฎีบท (หน้า 29 กลางของ G&HG) (ตามที่ใช้โดย McCabe):
ในกราฟที่เชื่อมต่ออย่างยิ่ง G หมายเลข cyclomatic เท่ากับจำนวนสูงสุดของวงจรอิสระเชิงเส้น
วงจรคือวงจรที่ไม่มีการเกิดซ้ำของจุดและขอบได้รับอนุญาต
กราฟที่บอกทิศทางได้รับการกล่าวถึงว่ามีการเชื่อมต่ออย่างแน่นหนาหากจุดสุดยอดทุกจุดสามารถเข้าถึงได้จากจุดสุดยอดอื่น ๆ ทุกจุดโดยผ่านขอบในทิศทางที่กำหนด
โปรดทราบว่าที่นี่เราส่งผ่านจากกราฟไม่มีทิศทางที่จะกราฟเชื่อมต่ออย่างยิ่ง (ซึ่งเป็นผู้กำกับ ... แบร์กไม่ได้ทำเรื่องนี้ให้ชัดเจน)
McCabe ใช้ทฤษฎีบทข้างต้นเพื่อหาวิธีง่าย ๆ ในการคำนวณ“ McCabe Cyclomatic Complexity Number” (CCN) ดังนี้:
กำหนดกราฟเป็นตัวแทนของ“กระโดดโครงสร้าง” ของกระบวนการ (กราฟการเรียนการสอนการไหล) กับจุดสุดยอดที่กำหนดเป็นตัวแทนของที่ไม่ซ้ำกันจุดเริ่มต้นและจุดสุดยอดที่กำหนดเป็นตัวแทนของที่ไม่ซ้ำกันออกจากจุด (จุดจุดสุดยอดทางออกอาจต้องมีการ“สร้าง” โดยการเพิ่มในกรณีที่มีการส่งคืนหลายครั้ง) สร้างกราฟที่เชื่อมต่ออย่างยิ่งโดยการเพิ่มขอบกำกับจากจุดยอดออกไปยังจุดเข้าจุดสุดยอดจึงทำให้จุดยอดสามารถเข้าถึงได้จากจุดสุดยอดอื่น ๆ
ตอนนี้ McCabe posits (ค่อนข้างสับสนฉันอาจจะบอกว่า) จำนวนรอบของกราฟการไหลของคำสั่งที่ปรับเปลี่ยน "สอดคล้องกับแนวคิดที่เข้าใจง่ายของเราเกี่ยวกับ 'จำนวนเส้นทางขั้นต่ำ'" และเราจะใช้จำนวนนั้นเป็นมาตรวัดความซับซ้อน
เจ๋งดังนั้น:
จำนวนความซับซ้อนตามวัฏจักรของกราฟการสอนที่ปรับเปลี่ยนสามารถกำหนดได้โดยการนับวงจร "ที่เล็กที่สุด" ในกราฟที่ไม่ได้บอกทิศทาง นี่ไม่ใช่เรื่องยากที่จะทำโดยคนหรือเครื่องจักร แต่การใช้ทฤษฎีบทข้างต้นทำให้เรามีวิธีที่ง่ายยิ่งขึ้นในการพิจารณา:
v (G) = e - v + p
ถ้าใครไม่สนใจทิศทางของขอบ
ในทุกกรณีเราเพียงแค่พิจารณาขั้นตอนเดียวดังนั้นจึงมีองค์ประกอบเชื่อมต่อเพียงหนึ่งเดียวในกราฟทั้งหมดและดังนั้น:
v (G) = e - v + 1
ในกรณีที่พิจารณากราฟต้นฉบับโดยไม่มีขอบ "exit-to-entry" ที่เพิ่มเข้ามาหนึ่งจะได้รับเพียง:
ṽ (G) = ẽ - v + 2
เป็นẽ = e - 1
ลองอธิบายโดยใช้ตัวอย่างของ McCabe จากกระดาษของเขา:
ที่นี่เรามี:
- e = 10
- v = 6
- p = 1 (องค์ประกอบเดียว)
- v (G) = 5 (เรานับอย่างชัดเจน 5 รอบ)
สูตรสำหรับหมายเลขที่เป็นวงกลมกล่าวว่า:
v (G) = e - v + p
ซึ่งให้ผลตอบแทน 5 = 10 - 6 + 1 และถูกต้อง!
"จำนวนความซับซ้อนของวัฏจักร McCabe" ตามที่ระบุในเอกสารของเขาคือ
5 = 9 - 6 + 2 (ไม่มีคำอธิบายเพิ่มเติมในบทความเกี่ยวกับวิธีการ)
ซึ่งเกิดขึ้นถูกต้อง (ให้ผล v (G)) แต่ด้วยเหตุผลที่ไม่ถูกต้องนั่นคือเราใช้:
ṽ (G) = ẽ - v + 2
ดังนั้นṽ (G) = v (G) ... วุ้ย!
แต่นี่เป็นการวัดที่ดีหรือไม่?
ในสองคำ: ไม่มาก
- ยังไม่ชัดเจนว่าจะสร้าง "กราฟการไหลของคำสั่ง" ของกระบวนการได้อย่างไรโดยเฉพาะอย่างยิ่งหากมีข้อยกเว้นในการจัดการและการเรียกซ้ำเข้าไปในรูปภาพ โปรดทราบว่า McCabe ใช้แนวคิดของเขาในการเขียนโค้ดในFORTRAN 66ซึ่งเป็นภาษาที่ไม่มีการเรียกซ้ำไม่มีข้อยกเว้นและโครงสร้างการดำเนินการที่ตรงไปตรงมา
- ความจริงที่ว่ากระบวนการที่มีการตัดสินใจและขั้นตอนที่มีการวนซ้ำทำให้ CCN เดียวกันนั้นไม่ใช่สัญญาณที่ดี