เห็น share VDO เรื่อง Moving IO to the edges of your app: Functional Core, Imperative Shell
มีหลายเรื่องที่น่าสนใจ เช่น
- การจัดการเกี่ยวกับ dependency เช่น I/O ควรทำอย่างไร
- เรื่องของ pure functio ในส่วนของ business logic
- Function code และ Imperative shell มันคืออะไร
มาดูกันหน่อย แบบมั่ว ๆ ไป ตามที่เข้าใจ
สิ่งที่ชอบมาก ๆ คือรูปนี้ น่าจะอธิบายได้ดีมาก ๆ
- ในส่วนของ business logic นั้น ควรเป็นอิสระจากส่วนอื่น ๆ ไม่ออกไปข้างนอกเลย เช่น I/O, database เป็นต้น
- ในส่วนของ business logic นั้น สามารถทำ unit test ได้ง่าย ๆ
- ไม่ควรมีการ injection พวก dependency เข้ามาใน business logic เลย หรือ มีเท่าที่จำเป็น มิเช่นนั้นก็จะ injection กับมากมาย เยอะไป ลำบากอีก ทำได้กับทำแล้วดี มันคนละเรื่อง
- ถ้าต้องการทำงาน หรือ ทดสอบกับพวก I/O ต่าง ๆ หรือ dependency ต่าง ๆ ควรทำ Integration test หรือ ต่อไปจริง ๆ เลยดีกว่า เนื่องจาก technology ในปัจจุบันมันเอื้อมากยิ่งขึ้น (คำว่าต่อจริงนั้น คือ ใช้ของจริง หรือ ของเหมือนจริงก็ได้ เช่น ใช้ Test container เข้ามาช่วย)
หรือเป็น Domain centric นั่นเอง รูปมันคุ้น ๆ เหมือนพวก hexagonal หรือ clean architecture ไหมนะ
แต่ในการทำงานจริง ๆ เรามักจะเน้นทำให้เสร็จกันไว้ก่อน
ทำให้ logic การทำงาน รวมไปกับ dependency ต่าง ๆ มากมาย
ส่งผลให้เกิดปัญหามากมายตามมา เนื่องจากมี side effect เยอะ
รวมทั้งเรื่องการทดสอบก็ทำได้ยากตามมาอีกด้วย
ยากไม่ได้บอกว่าทำไม่ได้ แต่ถ้าเข้าใจปัญหาตั้งแต่ต้นจะได้จัดการได้ถูกต้อง
ดัวนั้นในการเขียน code ที่ดีควรจะต้อง
- รับ input เท่าที่ต้องการใช้งานเท่านั้น และส่งผลลัพธ์ออกมา
- input เหมือนเดิม ต้องได้ output เหมือนเดิมเสมอ
- ไม่มี side effect ใด ๆ
Function code และ Imperative shell (FCIS) มันคืออะไร ?
ทำไมรูปมันคุ้น ๆ
- Function core คือส่วนการทำงานหลัก เช่น business logic, rule ต่าง ๆ และ data processing เป็นต้น ซึ่งเป็น pure function ไม่มี side effect ใด ๆ นั่นคือไม่ส่งผลต่อส่วนอื่น ๆ หรือ ส่วนอื่น ๆ ไม่ส่งผลต่อการทำงาน
- Imperative shell คือส่วนของระบบงานที่ต้องเจอ side effect ต่าง ๆ ว่าระบบงานจะ handle หรือจัดการอย่างไร เช่น การเชื่อมต่อ database, การเรียก service ผ่าน HTTP protocol, จัดการ logging และทำงานร่วมกับพวก 3-party ต่าง ๆ มันคือตัวกลางเชื่อมต่อระหว่าง Function core ไปยังส่วนงานภายนอกนั่นเอง
ตัวอย่างการทำงานของ FCID
น่าสนใจมาก ๆ สำหรับการออกแบบระบบ และ จัดการตามแนวคิดนี้
Reference websites