เห็น 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