หลังจากที่พูดคุยเรื่อง 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 แต่ละตัวควรมีรูปแบบหรือโครงสร้างตามการใช้งานหรือไม่ ?

มาดูตัวอย่างกัน

คำอธิบาย
ใน class User นั้นมีสิ่งที่ต้อง load อย่างเดียวคือ Name
ส่วน Role และ Subscription เป็น optional นั่นคือมีหรือไม่มีข้อมูลก็ได้ แล้วจะมีไปทำไม ?

คำถามที่เกิดขึ้นมาคือ
ทำไมเราถึงออกแบบ model class แบบนี้ ?
ทั้ง ๆ ที่ User นั้นถูกใช้งานที่แตกต่างกัน

สิ่งที่เราต้องหาคำตอบให้ได้คือ

  • User จะมี Role เมื่อใด ?
  • User จะมี Subscription เมื่อใด ?
  • User จะมีเฉพาะ Name เมื่อใด ?

ถ้าตอบได้เราจึงทำการออกแบบหรือสร้าง model class ตามการใช้งาน
จากบทความอธิบายไว้ว่า

  • User จะมี Role เมื่อผ่านการ authentication และ authorization มาแล้ว
  • User จะมี Subscription ได้ เมื่อมีข้อมูล report
  • User จะมีเฉพาะ Name คือ User ที่ใช้ทั่วไปในระบบ

เมื่อได้คำตอบแล้วจึงทำการสร้าง class ต่าง ๆ ได้ดังนี้

ข้อดีของแนวคิดนี้คือ
แต่ละ class อธิบายตัวมันเองชัดเจน (Descriptive)
และมีเป้าหมายที่เฉพาะเจาะจง
ทำให้การใช้งานง่ายและสะดวกขึ้น

แต่ผลเสียคือมี class จำนวนมากขึ้น
ซึ่งจะมองเป็นข้อดีหรือข้อเสียก็ได้
ขึ้นอยู่กับมุมมองและประสบการณ์ที่ผ่านมา
รวมทั้งจำเป็นต้องเข้าใจการทำงานและใช้งานด้วยนะ
ซึ่งจำเป็นมาก ๆ เมื่อระบบเริ่มมีขนาดใหญ่ขึ้น

คำถามที่น่าสนใจคือ เราทำการออกแบบ model กันอย่างไร ?