Repository pattern


  • Repository  
    • คือ การวางโครงสร้างของโค้ดรูปแบบหนึ่งเพื่อใช้แยก logic สำหรับการเข้าถึง ฐานข้อมูล (Data source) ออกจาก Business Logic โดยมี Repository Interface ทำหน้าที่เป็นตัวกลางในการติดต่อระหว่างสองอย่างนี้ ดังนี้



  • แล้วใช้ Repository มันดียังไง ??
    • หลังจากที่เราได้รู้จักความหมายและขั้นตอนการสร้าง Repository pattern กันไปแล้ว เรามาดูกันว่า Repository pattern เข้ามาช่วยแก้ปัญหาที่บอกไว้ข้างต้นได้อย่างไร

  • Reduce Duplicate Code    
    • เมื่อมีโค้ดที่คอยจัดการการเข้าถึงแหล่งข้อมูลเพียงที่เดียว จึงช่วยลดการเกิด Duplicate code ลงได้  
  • Easy to maintain
    • การที่มี Repository เป็นตัวกลาง ทำให้เราสามารถจัดการกับโค้ดที่เข้าถึงแหล่งข้อมูลได้ในที่เดียว ซึ่งหากวันใดวันนึงที่เราต้องการเปลี่ยน Tools หรือ Library ที่ใช้ในการเข้าถึงแหล่งข้อมูล ไม่ว่าจะเป็นการเชื่อมต่ออินเทอร์เน็ต การติดต่อกับฐานข้อมูล หรือแม้กระทั้งเปลี่ยนประเภทของแหล่งข้อมูลไปเป็นชนิดอื่น ก็สามารถทำได้ง่ายโดยไม่กระทบกับฝั่ง Business layer อีกทั้งยังช่วยลดการเกิด Dependency โดยการแยก Logic ที่ซับซ้อนในการเข้าถึงแหล่งข้อมูลออกจาก Business logic ทำให้โค้ดดู Clean ขึ้นอีกด้วย
  • Caching Data
    • เนื่องจาก Repository เป็นศูนย์กลางในการเข้าถึงแหล่งข้อมูล จึงสามารถทำ Caching data ให้กับข้อมูลของเราได้ ซึ่งช่วยลดจำนวนครั้งในการเข้าถึงแหล่งข้อมูล ส่งผลให้แอปฯทำงานเร็วขึ้น
  • Easy to Test 
    • การที่เราสามารถสับเปลี่ยน Data source ใน Repository ได้ โดยที่ไม่กระทบกับ Business logic นั้น ทำให้เราสามารถทดสอบการทำงานของระบบด้วยการใช้ Mock data ที่เราเตรียมไว้ได้ อีกทั้งเรายังสามารถทดสอบเฉพาะ Business logic ที่อยู่ภายใน Business layer ได้อีกด้วย เนื่องจาก Logic ที่ใช้ในการเข้าถึงแหล่งข้อมูลถูกแยกออกจาก Business logic แล้วนั้นเอง   

  • สุดท้ายนี้ ในฐานะที่ผม ที่เป็น PHP programer โดยใช้ Lumen ใน การพัฒนา Api กระผมคิดว่า การวาง pattern ใน รูปแบบ Repository + Interface มาคั่นระหว่าง Controller (Business Logic) และ Model (Data Source) ทำให้เราสามารถ เปลี่ยน Database ได้โดยแค่เปลี่ยน Model และให้ Repository set up data ก่อนส่งให้ Controller โดยที่ Business Logic ยังคงเหมือนเดิม ซึ่งง่ายตอนการปรับเปลี่ยนนั้นเอง

  • credit : https://medium.com/@nutron/repository-pattern-c66f1cb37f2a