หลังจากที่พูดคุยเรื่อง ORM (Object Relation Mapping)
ก็พบว่ามักจะพูดคุยเรื่องปัญหาของ dependency graph ที่เกิดขึ้น
ซึ่งส่วนใหญ่มักจะประสบภัยกับเรื่องนี้อย่างมาก
เมื่อระบบเริ่มมี model หรือ entity และความสัมพันธ์มากขึ้น
สุดท้ายส่งผลให้ระบบพังสิครับ
หรือไม่เช่นนั้นก็ memory หมด (OutOfMemory)
ทำไมถึงเป็นเช่นนั้นนะ ?
ปล. Lazy loading ยังเป็น feature ในเรื่อง ๆ อื่น ๆ อีกนะ
วิธีการที่ใช้แก้ไขปัญหาก็มีหลายแนวทาง เช่น
- ไม่ต้องมี relation ในระดับ model ทำการ mapping model กับ table/entity กันแบบ 1 ต่อ 1 เลย
- ถ้ายังไม่ใช้ก็ไม่ต้องไป load มาสิ ค่อยไป load เมื่อต้องการใช้งาน (Lazy loading)
- เพิ่ม memory สิ เรารวย
- เลิกใช้เลย
มาว่ากันเรื่องของ Lazy loading กันดีกว่า
ไปเจอบทความเรื่องที่น่าสนใจคือ Lazy loading is a code smell ทำการอธิบายไว้อย่างน่าสนใจ ว่า Lazy loading มันคือ code smell รูปแบบหนึ่ง model/entity class นั้น ๆ ต้องมีปัญหาแน่นอน เพราะว่ามีทั้งสิ่งที่ต้อง load เพื่อใช้งาน และมีสิ่งที่อาจจะไม่ต้องใช้งาน รวมกันอยู่ใน model class เดียวกันนั่นคือ เรากำลังออกแบบผิดหรือไม่ model เราผิดหรือไม่ ? กรอบหรือขอบเขตการทำงานผิดหรือไม่ ? model แต่ละตัวควรมีรูปแบบหรือโครงสร้างตามการใช้งานหรือไม่ ?มาดูตัวอย่างกัน [gist id="a5d88bc87fcc45f72899a9a1600e7510" file="User.java"] คำอธิบาย ใน class User นั้นมีสิ่งที่ต้อง load อย่างเดียวคือ Name ส่วน Role และ Subscription เป็น optional นั่นคือมีหรือไม่มีข้อมูลก็ได้ แล้วจะมีไปทำไม ? คำถามที่เกิดขึ้นมาคือ ทำไมเราถึงออกแบบ model class แบบนี้ ? ทั้ง ๆ ที่ User นั้นถูกใช้งานที่แตกต่างกัน สิ่งที่เราต้องหาคำตอบให้ได้คือ
- User จะมี Role เมื่อใด ?
- User จะมี Subscription เมื่อใด ?
- User จะมีเฉพาะ Name เมื่อใด ?
- User จะมี Role เมื่อผ่านการ authentication และ authorization มาแล้ว
- User จะมี Subscription ได้ เมื่อมีข้อมูล report
- User จะมีเฉพาะ Name คือ User ที่ใช้ทั่วไปในระบบ
คำถามที่น่าสนใจคือ เราทำการออกแบบ model กันอย่างไร ?