imKrish Developer
3 min readSep 15, 2016

และแล้วเราก็อยากเป็น Functional Programmer (ตอนที่ 1: Purity)

สวัสดีครับ บทความนี้เป็นบทความแปล (บทความแรกของผมในชีวิต) ที่ผมแปลมาจาก Charles Scalfani ใครอยากอ่านต้นฉบับเป็นภาษาอังกฤษสามารถอ่านได้ที่นี้เลยครับ https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.488b6sai9

ออกตัวก่อนเลยนะครับว่าผมไม่ได้เป็น expert ด้าน Functional Programming แต่อย่างใด ยังคงศึกษาอยู่ เห็นบทความนี้ดีก็เลยส่งข้อความ ไปขอเจ้าของบทความนี้มาแปลเป็นภาษาไทย เมื่อเขาอนุญาตผมก็มาแปลนี้แหละครับ 555

เอาหละครับ เรามาเริ่มกันเลยยยยยยยยย

Functional Programming นั้นเป็น paradigm หนึ่งสำหรับการเขียนโปรแกรม สำหรับคนที่เป็นโปรแกรมเมอร์ในยุคนี้คิดว่าทุกคนคงรู้จัก OOP นะครับ ซึ่ง OOP นี้ก็เป็น paradigm หนึ่งเหมือนกัน

ในการที่จะเริ่มเรียนรู้ Functional Programming นี้ก้าวแรกถือเป็นก้าวที่สำคัญมาก การเรียนรู้ด้วยมุมมองที่ถูกต้อง จะทำให้เพื่อนๆเข้าใจ Concept ได้ง่ายขึ้น และสามารถนำไปประยุกต์ใช้ แก้ปัญหาต่อไปในอนาคตได้

เพราะฉะนั้นค่อยๆอ่าน ค่อยๆทำความเข้าใจนะครับผม

ลบความรู้เก่าๆออกไปก่อน

หลายคนคงสงสัยว่าเอาหละ แล้วไอ Functional Programming เนี่ยมันต่างกับ Paradigm อื่นๆยังไงหละ เอาจริงๆถือว่ามากเลยทีเดียว แต่ก็ยังมีบาง Concept ที่ยังคงใช้ได้อยู่ เพียงแต่มันถูก Transform ด้วยมุมมองที่ต่างออกไป และก็มีบางสิ่งบางอย่างที่ปกติเราทำได้ในการ Coding ประจำวัน แต่ใน Functional Programming เนี่ยเราจะไม่สามารถทำมันได้อีกต่อไป !!!

ลองเปรียบเทียบ การขับรถยนต์ กับการขับยานอวกาศ…ในการขับรถยนต์เวลาเราขับไปผิดทาง เราก็แค่ถอยหลังแล้วก็ขับต่อไปได้ — แต่ในการขับยานอวกาศนี้ถอยหลังไม่ได้นะครับ… หะอะไรนะ!!! เพื่อนๆคงคิดในใจ เอ้าถอยหลังไม่ได้แล้วจะขับยังไงวะเนี่ย ไม่คุ้นเลย!!!

คำตอบก็คือในอวกาศเราไม่จำเป็นต้องถอยหลังครับ เพราะมันเคลื่อนที่ในแกน 3 มิติ เมื่อใดก็ตามที่เราเข้าใจใน Concept นี้แล้ว เราก็จะไม่คิดถึงการถอยหลังอีกต่อไป จริงๆแล้วเราอาจจะเห็นถึง Limit ของการขับรถยนต์ไปเลยก็เป็นได้ — Functional Programming ก็คล้ายๆกับการขับยานอวกาศนี้แหละครับ

เพราะฉะนั้นต่อจากนี้ ในบทความนี้ ลบเรื่องราวเก่าๆ ความรู้เก่าๆออกไปให้หมดก่อน ลืมมันไปสักแปป ทำสมองให้โล่ง แล้วมารับสิ่งใหม่ๆ จากมุมมองใหม่ๆกัน !!!

ความบริสุทธิ์ (Purity)

ใน Functional Programming นี้ Purity ก็คือ Pure Function

หลายคนคงสักสัยเอ๊ะแล้วไอ Pure Function นี้มันคืออะไรกันนะ

Pure Function คือ Function ที่ (1) รับ input เข้ามา (2) เอา input มา operate (3) return บางสิ่งบางอย่างออกไป

var z = 10;
function add(x, y) {
return x + y;
}

จากในตัวอย่างนี้จะเห็นได้ว่าฟังก์ชัน add รับตัวแปร x และ y เข้ามา แล้วก็ return ค่า x + y ออกไป ซึ่งการกระทำในฟังก์ชันนี้ไม่ได้ไปยุ่งกับ z ซึ่งเป็นค่าที่อยู่ใน environment ข้างนอกเลย (ไม่ได้เอาค่า z มาใช้, ไม่ได้ไปเปลี่ยนแปลงค่า z)

Pure Function จะไม่ยุ่งหรือส่งผลกระทบกับสิ่งแวดล้อมข้างนอก (Outer Scope)

ลองมาดูตัวอย่างนี้กันมั่ง

function justTen() {
return 10;
}

ถ้าฟังก์ชัน justTen เป็น Pure Function จะเห็นได้ว่ามันทำได้แค่ return ค่าคงที่ออกไป แล้วทำไมมันถึงทำได้เท่านี้หละ?

คำตอบคือ มันไม่มี Input อะไรเข้ามา และจากนิยามคือ Pure Function จะไม่ยุ่งกับ Environment ข้างนอก ดังนั้นฟังก์ชันนี้จึงทำได้แค่ return ค่า constant ออกไป

ถือได้ว่าไร้ประโยชน์!!! เพราะฉะนั้นแล้ว…

Pure Function ที่มีประโยชน์ ต้องมีอย่างน้อย 1 Parameter

คราวนี้มาพิจารณาอีกฟังก์ชันนึงกันมั่ง

function addNoReturn(x, y) {
var z = x + y
}

ฟังก์ชัน addNoReturn รับ x กับ y เข้ามา เอามาบวกกัน แล้วเก็บค่านี้ไว้ในตัวแปร z แต่เอ้ย ไม่ได้ return อะไรออกไปเลย !!!

นี้ก็ถือว่าไร้ประโยชน์!!! จึงเป็นที่มาของอีกบทสรุปนึงก็คือ…

Pure Function ที่มีประโยชน์ ต้อง return บางสิ่งบางอย่างออกไป

จำง่ายๆก็คือ มีรับก็ต้องมีให้นะครับ 555+

คราวนี้กลับมาพิจารณาฟังก์ชัน add กันอีกที

function add(x, y) {
return x + y;
}
console.log(add(1, 2)); // ปริ้นค่า 3
console.log(add(1, 2)); // ยังคงปริ้นค่า 3
console.log(add(1, 2)); // จะยังไงก็ได้ผลรับคือ 3

จะเห็นได้ว่า ถ้าเราให้ค่า x = 1 และ y = 2 จะเรียกฟังก์ชันนี้อีกสักล้านๆครั้ง มันก็จะ return ค่า 3 ทุกครั้ง เพราะมันคือ Pure Function ยังไงหละ!!! แต่ถ้าฟังก์ชันนี้มีการใช้ค่าจากสิ่งแวดล้อมภายนอก ถ้าถึงจุดๆนึงสิ่งแวดล้อมที่มันอาศัยอยู่เปลี่ยนไป เราก็จะไม่สามารถรู้ได้เลยว่าฟังก์ชันนี้จะ return อะไรออกมา เพราะฉะนั้น

Pure Function จะ return output ค่าเดิมทุกครั้ง ถ้ามีการเรียกด้วยการให้ input ค่าเดิม

คราวนี้เรามาดูตัวอย่างของ Impure Function กันมั่ง ฟังก์ชันเหล่านี้ก็คือฟังก์ชันที่เข้าถึงหรือส่งผลต่อสิ่งแวดล้อมข้างนอกนั่นเอง

writeFile(fileName); 
updateDatabaseTable(sqlCmd);
sendAjaxRequest(ajaxRequest);
openSocket(ipAddress);

Impure Function ก่อให้เกิดสิ่งที่เรียกว่า Side Effect เมื่อเราเรียกฟังก์ชันเหล่านี้ ยกตัวอย่างคือ มันจะไปเปลี่ยนข้อมูลของไฟล์, ไปอัพเดทฐานข้อมูล, ส่งข้อมูลไปยัง server หรือ บอกให้ os เปิด socket — จะเห็นได้ว่าฟังก์ชันเหล่านี้ทำมากกว่าการ (1) รับ input เข้ามา (2) เอา input มา operate (3) return บางสิ่งบางอย่างออกไป คือ มันเข้าถึงสิ่งแวดล้อมข้างนอกด้วย นั่นส่งผลให้เราไม่สามารถคาดเดาได้เลยว่าเราจะได้รับ output อะไร จากการเรียก Function เหล่านี้ ย้ำกันอีกที

“Pure Function ไม่มี Side Effect นะครับผม”

มาถึงตรงนี้อย่างน้อยๆ ก็คงจะเห็นข้อดีของ Pure Function กันมั่งแล้วนะครับ นั่นก็คือ Debug ง่าย Test ง่าย นั่นเอง เพราะมันไม่ได้ไปยุ่งเกี่ยวอะไรกับค่าข้างนอกเลย ไม่ว่าสิ่งแวดล้อม หรือกาลเวลาจะเปลี่ยนแปลงไปสักแค่ไหน Pure Function ดวงน้อยดวงนี้ก็จะ Return ค่าเดิมอยู่เสมอไป (555 ไม่ใช่ละ อันนี้ผมเสริมเองนะครับ)

มาถึงจุดนี้หลายๆคนคงนึก จะบ้าหรอใช้ได้แค่ Pure Function เนี่ยนะ มันจะไปเขียนโปรแกรมอะไรได้หละ !!! ใช่แล้วครับ เพราะใน Function Programming มันไม่ได้มีแค่ Pure Function นั่นเอง

Functional Programming นั่นไม่สามารถที่จะกำจัด Side Effect ได้หมดครับ เป้าหมายของ Functional Programing ก็คือ ลด Impure Code ที่ก่อให้เกิด Side Effect ให้มากที่สุด และจัดการมันให้อยู่เป็นที่เป็นทางครับผม

สรุปอีกทีนะครับ

คุณสมบัติของ Pure Function ที่มีประโยชน์ คือ

1. ไม่เข้าถึง และไม่ส่งผล ต่อสิ่งแวดล้อมข้างนอก (No Side Effect)

2. มี Parameter อย่างน้อย 1 ตัว

3. ต้อง Return บางสิ่งบางอย่างออกไป

ซึ่งจาก 3 ข้อนี้เองส่งผลให้ Pure Function จะ return output ค่าเดิมทุกครั้ง ถ้ามีการเรียกด้วยการให้ input ค่าเดิม

น้ำตาจะไหล เขียนมาตั้งนาน สาระมีอยู่ 4 บรรทัด 555+

ในบทความนี้ก็ขอจบไว้เท่านี้ก่อนนะครับ ผมคิดว่าคงมีอีก ไม่ต่ำกว่า 10 ตอน นะครับ เจ้าของบทความบอกไว้ว่าบทความของเขาคงมีประมาณ 6 ตอน แต่ตอนนึงของเขาเนี่ย ผมมาแปลได้ประมาณ 1–2 ตอนเลย (ยาวเกิน) ตอนแรกคิดว่าแปลบทความนี้น่าจะง่าย นี้เชื่อไหมผมนั่งแปลแค่นี้กินเวลาไปเกือบ 3 ชั่วโมงแล้ว คือมันไม่ได้ยากตรงแปล แต่ยากตรงการเอาภาษาอังกฤษที่เขาอยากจะสื่อ มาทำให้เป็นภาษาไทยนี้แหละ 555+

เครดิตทั้งหมดก็ให้กับ เจ้าของบทความคุณ Charles Scalfani ใครสนใจอยากเข้าร่วมกลุ่มใน Facebook ของเขากดได้ที่นี้เลย https://www.facebook.com/groups/learnelm/

ส่วนอันนี้เป็นแฟนเพจของผมครับ ฝากด้วยนะครับผม https://www.facebook.com/imkrish.developer/

“ Happiness Only Real When Shared ”

ที่เริ่มเขียน Blog เพราะไปดูหนังเรื่องนึงแล้วเจอ Quote นี้ ผมก็เลยจะลองดูครับว่ามันจริงหรือเปล่า

imKrish Developer

I’m going to be the best I could be, not someone tells me I should be. I am optimistic and I love freedom : )