Vesper บน Ballast: โครงสร้างสถานะเดียวจัดการทั้งระบบ
เจาะลึกเบื้องหลังแอป Vesper ที่ใช้เฟรมเวิร์ก Ballast แบบ KMP MVI เพื่อบริหารจัดการสถานะฝั่งหน้าบ้านและหลังบ้านอย่างเป็นระบบ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- Ballast คือเฟรมเวิร์ก KMP MVI ที่พัฒนาขึ้นเพื่อแอป Vesper โดยเฉพาะ
- ใช้โครงสร้าง Contract ประกอบด้วย Inputs, State และ Events ในทุกหน้าจอ
- หลีกเลี่ยงการใช้โค้ดรีเฟล็กชันและ KSP ด้วยการเขียนโค้ดแบบชัดเจนเพื่อความเสถียร
- ใช้ AppStateViewModel จัดเก็บสถานะข้ามหน้าจอผ่าน multiplatform-settings
ในบทความชุดบันทึกการออกแบบ Vesper ซึ่งเป็นการสร้างแอปพลิเคชันระดับโปรดักชันด้วย Kotlin Multiplatform บนงบจำกัด C.J. Brooks ผู้สร้างแอปได้อธิบายถึงสถาปัตยกรรมหลักที่ชื่อว่า Ballast ซึ่งทำหน้าที่เป็นสะพานเชื่อมระหว่างฝั่ง UI และงานเบื้องหลังบนเซิร์ฟเวอร์ โดยผู้สร้างยอมรับตรงไปตรงมาว่าตนเองเป็นผู้พัฒนาเฟรมเวิร์กนี้ขึ้นมาใช้งานเองมานานหลายปี
Ballast มีจุดเริ่มต้นจากการเป็นเฟรมเวิร์ก MVI สำหรับ Kotlin Multiplatform ที่ได้รับอิทธิพลมาจากแนวคิด Redux ของ React แต่ได้นำจุดเด่นของภาษา Kotlin อย่าง sealed interfaces มาผสมผสาน ร่วมกับการใช้ Coroutines เพื่อให้การไหลของข้อมูลเป็นไปในทิศทางเดียวอย่างยืดหยุ่นและปลอดภัย โดยกำหนดให้ทุกหน้าจอต้องสร้าง Contract ที่แบ่งออกเป็น Inputs, State และ Events

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
การเลือกใช้สถาปัตยกรรมแบบ opinionated หรือมีกฎระเบียบที่เข้มงวด ช่วยให้นักพัฒนาสามารถควบคุมโครงสร้างโค้ดได้ง่ายขึ้น โดยเฉพาะเมื่อทำงานร่วมกับเครื่องมือ AI อย่าง Claude Code ที่ถูกนำมาช่วยเขียนโค้ดโครงสร้างของ Vesper เนื่องจาก AI สามารถปฏิบัติตามแพทเทิร์นที่กำหนดไว้ล่วงหน้าได้อย่างแม่นยำ
สำหรับข้อจำกัดเรื่องการไม่ใช้ระบบอัตโนมัติหรือโค้ดรีเฟล็กชันนั้น มาจากปัญหาความไม่เสถียรของเครื่องมือสร้างโค้ดในระบบ Kotlin Multiplatform บนเนทีฟ การเขียนโค้ดแบบชัดเจนจึงช่วยให้โค้ดมีความโปร่งใส สามารถดีบักและแก้ไขเพิ่มเติมได้ง่ายในระยะยาวโดยไม่ต้องพึ่งพาไลบรารีภายนอก
"Claude loves structure"
เพื่อนร่วมงานของผู้พัฒนา
ในส่วนของการจัดการข้อมูล Vesper ได้ใช้ AppStateViewModel ที่ทำงานครอบคลุมทั้งแอปพลิเคชันเพื่อเก็บข้อมูลสำคัญ เช่น โทเค็นยืนยันตัวตน ค่าสถานะธีม และสถานะการเริ่มต้นใช้งาน โดยบันทึกข้อมูลทั้งหมดลงในดิสก์ผ่านโมดูล saved-state ทำให้สามารถกู้คืนสถานะเดิมได้ทันทีเมื่อเปิดแอปใหม่
แนวทางดังกล่าวยังช่วยลดความจำเป็นในการใช้ฐานข้อมูล SQLite ขนาดใหญ่ เนื่องจากข้อมูลท้องถิ่นของแอปมีเพียงไม่กี่ค่าเท่านั้น ขณะเดียวกัน Ballast ยังถูกนำไปใช้ขับเคลื่อนระบบคิวเบื้องหลังผ่าน ballast-queue และงานกำหนดเวลาผ่าน ballast-scheduler บนฐานข้อมูล Postgres อีกด้วย
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น