พอดีผมได้ Review งานน้อง และดู Coverage Report ที่ได้ Generate จาก ReportGenerator แล้วในส่วน Risk Hotspots ตอนแรกมันจะมีแค่ตัว Cyclomatic complexity แต่ตอนนี้มีตัว Crap Score ขึ้นมาด้วย

มันเลยเป็นที่มา และสงสัยเลยเอามาเขียน Blog ครับ โดยสรุปสั้นๆก่อน
- Cyclomatic complexity - Metric ที่ใช้วัดความซับซ้อนของของ Code เรา โดยถ้ามีเงื่อนไข (เช่น if, else, switch, for, while) จะยิ่งซับซ้อนขึ้น ค่ายิ่งน้อยยิ่งดีครับ
- Crap Score - Metric ที่ใช้ประเมินความเสี่ยงของ Code หากมีการเปลี่ยนแปลงแก้ไข
Change Risk Anti-Patterns (CRAP)
จากความหมายสั้นๆไปแล้วมาดูความหมายเต็มๆกันครับ ว่า Change Risk Anti-Patterns (Crap) Metric ที่ใช้ประเมินความเสี่ยงของ Code หากมีการเปลี่ยนแปลงแก้ไข คิดค้นโดยคุณ Alberto Savoia / Bob Evans ซึ่งจะดูจากข้อมูล 2 ชุด ได้แก่
- Cyclomatic complexity (CC) - วัดความซับซ้อนของ Code เรา
- Code Coverage (coverage) - ว่า Code ที่เราสนใจ มีการเขียน Automated Test ครอบคลุมอยู่กี่เปอร์เซ็นต์
- สูตรการคำนวณของ CRAP
CRAP = CC² × (1 - coverage/100)³ + CC
- การตีความค่า CRAP
มันมีหลายเจ้าตั้งเกณฑ์ไว้ต่างกัน แต่เอาง่าย ยิ่งน้อย ยิ่งดี ครับ อย่างตัวอย่างนี้ เป็นเกณฑ์ + Recommend Action
| CRAP Score | Description | Recommend Action |
|---|---|---|
| 0 - 30 | ยอมรับได้ | |
| 30 - 60 | เริ่มอันตรายแล้ว | ควรเขียน Test เพิ่ม หรือ Refactor Code |
| 60 ขึ้นไป | เสี่ยงสูงมาก | ต้องรีบมาแก้ไขโดยการ Refactor Code + Test เพื่อลด Technical Debt ที่กำลังสะสม |
Refactor Code - การแยกโค้ดยาวๆ ออกเป็นฟังก์ชันย่อยๆ หรือหลีกเลี่ยงการใช้ if/else ซ้อนกันหลายชั้น เป็นต้น
- Tools ที่มาช่วยวัดหละ
ถ้ามีคนทำของอยู่แล้วใช้ของเค้าสิ เช่น
- Java - Crap4J / gmetrics (grovvy)
- .NET - crap4n / ReportGenerator / ndepend / (เสียเงิน) / มีพวก Skill ด้วยนะ skills/net-crap-coverage-analysis / VS-Code Extension
- TypeScript / JavaScript - crap4ts / js-crap-score / crap-typescript
- Golang - ยังหาไม่เจอ ถ้าเรามี gocyclo + coverage จาก
go test -coverแล้วให้มัน Calc ใน CI Pipeline ก็ได้ - Rust - cargo-crap
ระหว่างที่ผม Research ไปพบว่าพวก Metric นี้ Idea ดีนะ
- Code ที่ซับซ้อน - แต่ไม่มี Automated test คลุมอยู่เลย อันตราย และ Maintain ได้ยาก
- แต่ Code ที่ซับซ้อน - มี Test ควบคุมอยู่ มันจะช่วยลดความเสี่ยงลงได้ แต่ต้อง Assert จริงๆนะ ล่าสุดผมไปเจอ Senior ไปปรับแล้ว Test พัง พี่แกเล่นใส่
Assert.IsTrue(True)อันนี้ก็ไม่ช่วยนะ - Automated test มันไม่ได้สมบูรณ์แบบ แต่มันช่วยให้เรามั่นใจขึ้นก่อนส่งมอบของ
- Metric เป็นงานขึ้นหึง แต่มีคนเอามาใช้ ยิ่งในยุคของ AI Gen มีคนเอา CRAP มาช่วยวัด Code จาก AI + Technical Debt - ถ้าสนใจไปดู VDO ข้างล่างได้ แนะไว้แล้ว
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.



