ในการดูแลรักษา code ของระบบต่าง ๆ มันไม่ได้ง่ายเลย
ยิ่งเป็น Legacy code แล้วยิ่งยากเข้าไปใหญ่
แต่ก่อนอื่นต้องทำความเข้าใจกับ code ก่อน
ทั้งเรื่องของ
- ข้อมูลทั่วไปของ code เช่น จำนวนบรรทัด จำนวนไฟล์ จำนวน method
- ข้อมูลเรื่องความซับซ้อนของ code
- ข้อมูลเรื่อง code ที่ซ้ำซ้อน (Duplication)
- ความสัมพันธ์ของ code (Dependency)
คำถาม ทำไมเราต้องรู้ว่า code มันมีความสัมพันธ์กันอย่างไร ?
คำตอบ เราจะรู้ และ มั่นใจได้อย่างไรว่า code ที่เรากำลังทำการแก้ไขนั้น มันกระทบส่วนไหนบ้าง ? เช่น- มี code ส่วนไหนที่เรียกใช้บ้าง ?
- มี code ส่วนไหนถูกเรียกใช้บ้าง ?
ระบบตัวอย่าง คือ Android project
ซึ่งทำการ build ด้วย Gradle ส่วน library สำหรับการดูความสัมพันธ์ของ code คือ JDepend โดย JDepend นั้น ทำการสรุปให้ว่า Source code ของภาษา Java ที่เราเขียนขึ้นมาในแต่ละ package นั้น มันไปเรียกใช้งาน class/method จาก package อะไรบ้าง ? มันถูกเรียกใช้งานจาก packagge ไหนบ้าง ? ซึ่งทำให้เราเห็นว่า คุณภาพในการออกแบบ code ของระบบเราเป็นอย่างไร ทั้งในมุมมองของ extensibility ทั้งในมุมมองของ reusability ทั้งในมุมมองของ maintainability ในระดับของ package เพื่อทำให้เราสามารถแก้ไขได้อย่างถูกต้องการใช้งาน JDepend กับ Gradle
เนื่องจาก Android project นั้นทำการ build ด้วย Gradle ดังนั้นเราจึงต้องเพิ่ม JDepend เข้าไปที่ Gradle ด้วย ดังนี้ [gist id="78bc992c0d0325145127" file="build.gradle"] คำอธิบาย- เพิ่ม plugin jdepend
- ในทำงานหลังจาก task compileDebugSources
- เพิ่ม task ชื่อว่า jdepend เข้าไปใน project โดยผลการวิเคราะห์จะอยู่ในไฟล์ build/reports/jdepend.xml
แต่ผลการทำงานจาก JDepend นั้นจะเป็นไฟล์ XML ซึ่งอ่านลำบาก
จึงต้องใช้เครื่องมืออื่นมาช่วยเหลือนิดหน่อย ดังนี้ 1. นำไปทำงานกับ Jenkins หรือระบบ Continuous Integration (CI) เนื่องจากมี plugin สำหรับการสร้างรายงานของ JDepend อยู่แล้ว ซึ่งมีผลการทำงานดังรูป ซึ่งจากรายงานมันมี column ต่าง ๆ ที่ต้องเข้าใจคือ- TC (Total Class) จำนวน class ทั้งหมดในแต่ละ package = CC + AC
- CC (Concrete Class) จำนวน concrete class ทั้งหมดในแต่ละ package
- AC (Abstract Class) จำนวน abstract class หรือ interface ทั้งหมดในแต่ละ package
- Ca (Afferent Coupling) จำนวน package อื่นที่เรียกใช้งาน class จาก package นี้
- Ce (Efferent Coupling) จำนวน package อื่นที่ถูกเรียกใช้งาน class จาก package นี้
- A (Abstractness) อัตราส่วนระหว่า abstract class/interface กับ class ทั้งหมดใน package
- I (Instability) เป็นค่าที่บอกว่าใน package นี้จะเปลี่ยนแปลงบ่อยหรือไม่ ถ้าค่ามาแสดงว่าเปลี่ยนบ่อย หรือ ไม่เสถียรนั่นเอง คำนวณจากสูตร Ce / ( Ce + Ca )
- D (Distance from the main sequence) เป็นค่าความสมดุลระหว่าง A กับ I โดยที่ A+I=1 ดังนั้น D = 1 - (A+I)
- V (Volatility) โดยปกติมีค่าเป็น true หรือ 1 นั่นคือ เอา package เหล่านั้นมาคิดคำนวณนั่นเอง ถ้าไม่ต้องการมาคำนวณก็กำหนดเป็น false หรือ 0 ได้