fp-pack ยูทิลิตี้เชิงฟังก์ชัน TypeScript แบบเน้น Pipe ที่ใช้งานได้ง่ายในงานจริงของทีม
(github.com/superlucky84)1. ที่มา – ทำไมถึงสร้างขึ้นมา
ผมคิดว่าแต่ละคนอาจให้คุณค่ากับสิ่งสำคัญใน functional programming ไม่เหมือนกัน
บางคนอาจให้ความสำคัญกับความสมบูรณ์เชิงทฤษฎี ขณะที่บางคนอาจมองว่าความสม่ำเสมอของการทำ abstraction สำคัญกว่า
สำหรับผม ในบรรดาสิ่งเหล่านั้น
ความสามารถในการมองเห็นการไหลของข้อมูลแบบประกาศชัดผ่าน pipe ได้ในภาพรวม
คือข้อดีที่ใหญ่ที่สุดของ functional programming มาโดยตลอด
โดยเฉพาะในสภาพแวดล้อมอย่าง JavaScript ที่โค้ดซับซ้อนได้ง่าย
ผมคิดว่าโครงสร้างที่ทำให้เห็นได้ชัดว่า
ข้อมูลมาจากไหนและไหลไปที่ไหน
เป็นสิ่งที่สำคัญยิ่งกว่าในงานจริง
แต่เมื่อพยายามนำแนวทางนี้ไปใช้กับ
การทำงานจริงระดับทีมที่มีสมาชิกซึ่งมีความเข้าใจด้านการเขียนโปรแกรมแตกต่างกัน
ก็มักจะเจอกับข้อจำกัดในโลกความเป็นจริงอยู่บ่อยครั้ง
ระหว่างกระบวนการนำ functional pattern มาใช้
ค่าต่าง ๆ ถูกห่อหุ้มด้วยโครงสร้างที่ abstract มากขึ้นเรื่อย ๆ
และมีช่วงที่ต้องทำความเข้าใจกฎเฉพาะในแต่ละขั้นกลางเพิ่มขึ้น
จนทำให้ “ความอ่านง่ายของ flow ตลอดทั้ง pipeline”
ซึ่งเป็นสิ่งที่ผมให้ความสำคัญ
เลือนหายไปหลายครั้ง
ช่วงหลังมานี้ เครื่องมือที่ช่วยสร้างโค้ดก็ยิ่งซับซ้อนและแม่นยำขึ้นเรื่อย ๆ
ทำให้เจอสถานการณ์ที่การออกแบบซับซ้อนเกินจำเป็นโดยไม่ตั้งใจบ่อยขึ้นเช่นกัน
ดังนั้นใน fp-pack ไม่ว่าจะเป็นคนหรือเครื่องมือ
จึงตั้งใจเลือกโครงสร้างที่
ชี้นำให้เขียนเฉพาะ pipeline ที่เรียบง่ายที่สุดเท่าที่จะเป็นไปได้
fp-pack คือโปรเจกต์ส่วนตัวที่สร้างขึ้นจากประสบการณ์เหล่านี้
โดยให้ความสำคัญกับ
ความอ่านง่ายแบบเน้น Pipe ที่สามารถดูแลต่อเนื่องได้ในสภาพแวดล้อมการทำงานเป็นทีม
มากกว่าความสมบูรณ์แบบเชิงทฤษฎี
เพื่อให้การจัดการ side effect ในแนว functional ไม่ถูกจำกัดไว้เฉพาะคนที่คุ้นเคยกับทฤษฎีบางแบบเท่านั้น
จึงได้นำแนวทางจัดการ Side Effect เชิงทดลองที่ตีความใหม่ให้อยู่ในรูปแบบที่เข้าใจง่ายมาด้วย
(ดูคู่มือที่เกี่ยวข้องได้ที่ 👉 https://superlucky84.github.io/fp-pack/#/ko/guide/side-effect-guide).
2. หลักการสำคัญ
-
ยึด Plain Value เป็นศูนย์กลาง
ภายใน pipeline จะไม่ห่อหุ้มค่าโดยไม่จำเป็น
แต่คง Plain Object / Plain Value ไว้ตามเดิม
เพื่อให้เข้าใจ flow และดีบักได้อย่างเป็นธรรมชาติ -
แยก Side Effect อย่างชัดเจน
จะออกแบบให้ใช้ pipeline เฉพาะทางแยกต่างหาก
เฉพาะในกรณีที่ต้องมีการหยุดกลางทาง (Early Exit) หรือจัดการข้อยกเว้นเท่านั้น -
เส้นโค้งการเรียนรู้ต่ำ
แทนที่จะเพิ่มแนวคิดใหม่ ๆ
จะยึดรูปแบบการใช้งานpipe,pipeAsyncที่คุ้นเคยเป็นหลัก
เพื่อให้แชร์ใช้งานร่วมกันในทีมได้ง่าย -
ความปลอดภัยของประเภทข้อมูล
ใช้ TypeScript เพื่อให้ตรวจสอบความไม่สอดคล้องของ type ระหว่างทางใน pipeline ได้ตั้งแต่ตอน compile
3. สรุปท้ายเรื่อง
แม้จะไม่ต้องเรียนรู้แนวคิดซับซ้อนใหม่ ๆ
ก็หวังว่าจะเป็นอีกหนึ่งตัวเลือกสำหรับผู้ที่อยากนำข้อดีสำคัญของ functional programming ในสภาพแวดล้อม JavaScript / TypeScript
อย่าง
“โค้ดที่อ่านการไหลของข้อมูลได้ง่าย”
ไปใช้ในงานจริงได้อย่างเป็นธรรมชาติ
🔗 เอกสาร (Documentation)
https://superlucky84.github.io/fp-pack/#/ko
🔗 GitHub
https://github.com/superlucky84/fp-pack
1 ความคิดเห็น
ผมนึกถึงการเขียนโปรแกรมที่ผสานแนวคิดเชิงฟังก์ชันเข้าไป ซึ่งสมาชิกทีมจากหลากหลายพื้นเพ รวมถึงนักพัฒนาระดับต้นถึงกลาง
สามารถนำไปใช้ได้อย่างเป็นธรรมชาติโดยไม่ต้องฝืนปรับตัวให้เข้ากับสไตล์หรือวิธีคิดแบบใดแบบหนึ่งเป็นพิเศษ
ขอแค่เข้าใจเรื่องฟังก์ชัน
pipeและการเคอร์รีิงในระดับหนึ่งจึงได้ลองสร้าง fp-pack ขึ้นมาครับ