/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day5] Function

วันที่ห้าของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เรามาเปลี่ยนเรื่องกันบ้างดีกว่า และเรื่องที่จะพูดในวันนี้ก็คือ function/method


function คือส่วนการทำงานย่อยๆ ของโปรแกรม ที่เราสามารถเรียกให้มันทำงานได้โดยใช้ชื่อ ฟังกชันสามารถรับค่า parameter (input) เข้าไปเพื่อทำอะไรบางอย่าง แล้วอาจจะส่งข้อมูล output ออกมา เช่น ฟังก์ชันสำหรับหาค่ารากที่สอง (sqrt) เราจะสามารถส่งตัวเลขจำนวนจริงใดๆ เข้าไป แล้วเราก็จะได้ผลลัพธ์ออกมา

method นั้นมีคุณสมบัติไม่ต่างจากฟังก์ชัน เว้นแต่ method จะต้องอยู่บน object เท่านั้น ในขณะที่ฟังก์ชันจะไม่ขึ้นกับ object ใดๆ และเนื่องจาก method ขึ้นกับ object ทำให้ method สามารถเรียกใช้คุณสมบัติต่างๆ ของ object นั้นๆ ได้อย่างเต็มที่

Math functions vs Programming functions

ในคณิตศาสตร์ที่เราเรียนกันมาตั้งแต่ยังเล็กยังน้อยนั้นบอกเราว่า บอกว่าฟังก์ชันคือความสัมพันธ์ระหว่างเซ็ตของข้อมูลขาเข้า และเซ็ตของข้อมูลขาออก โดยฟังก์ชันจะต้องมีคุณสมบัติของ Referential transparency กล่าวคือ ในนิพจน์ใดๆ ที่มีฟังก์ชันเป็นส่วนประกอบ เราสามารถแทนที่ฟังก์ชันนั้นๆ ด้วยค่าของมัน (ผลลัพธ์ของฟังก์ชัน) แล้วไม่เกิดผลกระทบใดๆ ต่อค่าของนิพจน์นั้นๆ นั่นหมายความว่าถ้าเราใส่ข้อมูลเดิมลงในฟังก์ชั่นแล้ว ผลลัทธ์ที่ได้จากฟังก์ชันนั้นย่อมได้เท่าเดิมเสมอ ไม่ว่าจะใส่วันนี้ พรุ่งนี้ หรือปีไหนๆ

ในเชิงโปรแกรมมิ่งแบบ imperative ฟังก์ชันก็อิงมากจากคณิตศาสตร์เช่นกัน แต่คุณสมบัติของ Referential transparency อาจจะไม่ได้เป็นจริงเสมอ เนื่องจากในโปรแกรมมิ่งเราสามารถ Access ค่าอื่นๆ ที่ไม่ใช่ input จากภายใน function ได้ (state ของโปรแกรม) และผลลัพธ์ของฟังก์ชันเดิมด้วยพารามิเตอร์เดิมอาจจะไม่เท่ากันก็เป็นได้ นอกจากนี้เรายังสามารถสร้างฟังก์ชันที่ไม่คืนผลลัพธ์ได้ในขณะที่เป็นไปไม่ได้ในคณิตศาสตร์

ในเชิงโปรแกรมมิ่งแบบ pure functional เมื่อฟังก์ชันเป็นประชากรชั้นหนึ่งของโปรแกรมแล้ว คุณสมบัติตามคณิตศาสตร์ก็มาเต็มเลยทีเดียว เราไม่มีทางที่จะแก้หรือ้างถึง state ของโปรแกรมได้จากภายในฟังก์ชัน มีแต่พารามิเตอร์ที่ส่งมาเท่านั้นที่ฟังก์ชันเห็น แถมยังไม่สามารถสร้างฟังก์ชันที่ไม่คืนผลลัพธ์ได้อีกด้วย

เมื่อคนส่วนใหญ่เขียนโปรแกรมแบบ imperative และมักไม่ออกแบบฟังก์ชันให้เป็น Referential transparency อีก ฟังก์ชันมีสิทธิ์แก้ state ของโปรแกรม และ state ของโปรแกรมสามารถเปลี่ยนได้ขณะที่ฟังก์ชันทำงานอยู่ หายนะในการ Debug จึงบังเกิด แล้วจะทำไงดีล่ะ?

  • เลิกอ้างถึง state ของโปรแกรมในฟังก์ชัน เว้นแต่ค่านั้นจะเป็นค่าคงที่ นอกนั้นให้ส่งเป็นพารามิเตอร์

  • เลิกเปลี่ยน state ของโปรแกรมในฟังก์ชัน

เอ๊ะ แล้วงี้จะอัพเดท UI ได้ไง นั่นสิครับ ผมเองก็ไม่รู้เหมือนกันถ้าไม่เปลี่ยนไปใช้วิธีอัพเดท UI แบบอื่น เช่น reactive ก็เอาเป็นว่าลดการยุ่งเกี่ยวกับ state ถ้าไม่จำเป็นละกัน แต่ถ้าจำเป็นก็ใช้ต่อปายย

‪#‎day5‬ #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...