Functional Programming คืออะไร ?
Functional Programming เป็นรูปแบบ “การเขียนโปรแกรมเชิงฟังก์ชัน” ถ้าได้ยินชื่ออย่างเดียวอาจจะคิดว่ามีแค่การสร้างฟังก์ชันมาใช้งานแล้วก็จบไป แต่ว่าจริงๆแล้ว Functional Programming ยังมีหลักการและรายละเอียดสำคัญๆอยู่อีกหลายอย่าง
การจะเขียนโปรแกรมแบบ Functional Programming นั้นถ้าจะศึกษาใช้งานให้ถูกต้องจริงๆก็คงจะต้องใช้เวลาในการเรียนรู้และทดลองใช้ เพราะว่า Functional Programming นั้นเกิดขึ้นมาเป็นเวลานานแล้วโดยพัฒนามาจาก Lambda calculus (https://en.wikipedia.org/wiki/Lambda_calculus) จนมีรูปแบบและรายละเอียดต่างๆเป็นของตัวเองเพิ่มขึ้นกลายเป็น Functional Programming ในที่สุด
🐱 หลักการของ Functional Programming
การเขียนโปรแกรมแบบ functional นั้น เราจะเน้นไปที่การใช้ Pure Function ซึ่งหลักการของมันมีแค่ 3 ขั้นตอนง่ายๆคือ
- รับค่า
- ดำเนินการบางอย่างกับค่าเหล่านั้น
- return ผลลัพธ์ออกไป
ตัวอย่างอันแสนbasic
function add(x, y) {
return x + y;
}
อ้าว ก็เหมือน function ปกตินี่นา
ใช่แล้วมันเหมือน แต่ว่า Pure Function นั้นการเขียนของมันจะต้องไม่มีการยุ่งเกี่ยวหรือเปลี่ยนแปลงอะไรก็ตามภายนอก function เด็ดขาด ดังนั้นฟังก์ชันที่เขียนออกมานั้นไม่ว่าจะใส่ค่าอะไรซ้ำไปกี่รอบ ก็จะออกมาเป็นค่าเดิมเสมอ (Immutability) นี่แหละเป็นที่มาของคำว่า
⭐ “Pure Function”
แล้วทำไมต้องใช้? สิ่งสำคัญที่สุดของ Functional Programming นั้น คือการลด side effect ที่เกิดจาก function ที่เราเขียนขึ้นมา
⭐ “Side Effect คืออะไร?”
อย่างที่เรารู้ว่า pure function นั้นไม่ยุ่งกับอะไรภายนอกเลย impure ก็กลับกันคือมีการยุ่งกับโลกภายนอก ไม่ว่าจะใช้ตัวแปร global หรือเปลี่ยนแปลงค่าใดๆภายนอกฟังก์ชัน การกระทำใดๆที่มีผลกับโลกภายนอกล้วนเป็น side effect จาก impure function ทั้งสิ้น
ปัญหาที่ตามมาก็คือเมื่อฟังก์ชันนึงมีผลกระทบกับสิ่งที่อยู่ภายนอกหรือฟังก์ชันอื่นๆที่รับค่านั้นเข้าไป แล้วถ้าเกิดปัญหากับโปรแกรมของเราในซักฟังก์ชันนึง เราจะต้องไปตามดูที่ฟังก์ชันไหนล่ะ? แค่ Pure Function นั้น? หรือ Impure Funtion ทั้งหมด? ด้วยเหตุนี้ทำให้การใช้ functional programming ทำให้โค้ดอ่านและแก้ไขได้ง่าย
ตัวอย่าง Impure Function ที่ทำให้เกิด side effect กับตัวแปร i
let i = 5;
function addFive() {
i = i+5;
}
⭐ First-Class Function
คือการที่ฟังก์ชันที่สร้างขึ้นนั้นไม่มีข้อจำกัดในการนำไปใช้งานส่วนต่างๆของโปรแกรม รวมไปถึงการนำไปกำหนดเป็นค่าให้กับตัวแปรก็ยังได้ ส่วน
⭐ Higher-Order Function
จะเป็นการที่ “ฟังก์ชัน” สามารถรับ “อีกฟังชัน” มาเป็น Argument และนำไปจัดการได้ รวมถึงการที่รีเทิร์นค่ากลับไปเป็นฟังก์ชันก็ได้เช่นกัน ซึ่งจะทำให้ลด side effect ต่างๆที่จะเกิดขึ้นจากตัวแปรทั่วๆไปได้เยอะมากๆ
// ตัวแปร add มีค่าเป็น ฟังก์ชันได้ (First-class function)
var add = (x, y) => x + y;
// ฟังก์ชัน divideTwo รับฟังก์ชันอื่นเป็น Argument
// และ return เป็นฟังก์ชันได้ (Higher-order function)
function divideTwo(fn, x, y){
return fn(x, y)/2;
}
console.log(divideTwo(add, 3, 2)); // 2.5
❓ จำเป็นต้องเปลี่ยนไปใช้รึเปล่า ?
ขึ้นอยู่กับว่างานที่เราทำนั้นเป็นแบบไหน เช่นเดียวกันกับ OOP ที่ไม่ได้เหมาะสมกับทุกงานกับทุกภาษา Functional Programming ก็มีงานที่เหมาะและไม่เหมาะจะนำไปใช้งานเช่นกัน เพราะการเขียนโปรแกรมแต่ละรูปแบบก็จะมีจุดเด่น จุดด้วย ต่างกันไป อย่าง OOP ก็ชูเรื่องการเขียนโค้ดเป็น module ส่วน Functional Programming ก็เน้นการเป็น Pure Function แต่ในสมัยนี้ที่ความนิยมหรือการถูกพูดถึงของมากขึ้นของ Functional Programming ก็ทำให้หลายๆภาษาโปรแกรมพัฒนาให้รองรับการเขียนรูปแบบนี้ ถ้าใครสนใจก็ลองลองศึกษาดูว่าภาษาที่ตัวเองถนัดนั้นรองรับแค่ไหน ส่วนใครที่เคยเขียน OOP มาก่อนก็อาจจะต้องปรับเปลี่ยนแนวคิดกันสักเล็กน้อย ซึ่งวิธีที่ดีที่สุดก็คงจะไม่พ้นการลงมือทำจริงๆนั่นเอง
Functional Language
https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Functional_languages
ข้อมูลอ้างอิง