วิธีทำให้ Code อ่านง่าย ด้วยการใช้ Functional Programming

05-ธ.ค.-18

คัมภีร์เทพ IT

สำหรับ Programmer/Developer แล้ว การเขียน Code ให้อ่านง่าย ถือเป็นทักษะสำคัญที่จำเป็นในการทำงาน เนื่องจากหลายๆ คนคงทำงานร่วมกับคนอื่นกันเป็นทีม วันนี้ทีมงานมีเทคนิคเกี่ยวกับ วิธีทำให้ Code อ่านง่าย ด้วยการใช้ Functional Programming มาฝากกัน อ่านจากบทความนี้กันได้เลย

Pure functions ถือเป็น code ที่อ่านและเข้าใจได้ง่าย เพราะ dependencies ทั้งหมดของ function อยู่ใน definition อยู่แล้ว ทำให้ง่ายต่อการอ่าน นอกจากนี้ Pure functions โดยทั่วไปมักมีแนวโน้มที่จะทำหน้าที่เพียงอย่างใดอย่างหนึ่งเท่านั้น รวมทั้งมักเป็น code ที่สั้นๆ อีกด้วย

Chaining

Chaining เป็นเทคนิคที่ใช้เพื่อลดความซับซ้อนของ code ที่โดยที่ประยุกต์ใช้หลายๆ method ใน object เดียว

ลองดูและเปรียบเทียบ ระหว่าง 2 styles นี้คือ imperative และ functional สำหรับ functional style จะใช้ toolbox พื้นฐานเพื่อ list operations filter() และ map() จากนั้นก็ใช้มันร่วมกัน

กรณีนี้จะใช้ collection ของ task โดย task จะมี id, description (desc), boolean completed และ type

จะสังเกตว่า การ callback สำหรับ filter() และ map() เป็น pure functions ซึ่งมีชื่อตรงกับสิ่งที่มันตั้งใจจะทำ

map () จะแปลงจาก list ของ value หนึ่งไปอีก list ของ value หนึ่งโดยใช้ mapping function

Point-free style

ในตัวอย่างก่อนหน้านี้ เราได้ใช้ point-free style ในการ compose functions ซึ่ง point-free เป็นเทคนิคที่ช่วยเพิ่มความสามารถในการอ่านโดยการกำจัด arguments ที่ไม่จำเป็นออกไป ลองดูตัวอย่าง code ต่อไปนี้:

ใน point-free style นั้น จะถูกเขียนโดยไม่มี arguments

Partial Application

ต่อไป เราจะไปดูกันถึงวิธีที่เราจะสามารถปรับปรุงในเรื่องการอ่านให้ง่ายขึ้นและทำการ reuse function ที่มีอยู่ แต่ก่อนจะไปถึงขั้นนั้น เราต้องสร้าง function ใหม่ ใน toolbox ของเราก่อน

partial application จะเป็นกระบวนการกำหนดจำนวน arguments ให้กับ function ซึ่งถือเป็นวิธีจาก generalization ไปสู่ specialization

สำหรับ partial application นั้น เราสามารถใช้ partial() function จาก libraries ที่เป็นที่นิยมอย่าง underscore.js หรือ lodash.js ได้ และ bind() method สามารถใช้ในการทำ partial application ได้

สมมติว่า เราต้องการ refactor imperative code ต่อไปนี้ ไปเป็นแบบ functional style ซึ่งง่ายต่อการอ่านมากกว่า:

ดังที่ได้กล่าวไปแล้ว ตอนนี้เราต้องการสร้าง generic function ที่สามารถถูกใช้เพื่อการ filter จาก task type อื่นๆ ได้ ซึ่ง isTaskOfType() ก็คือ generic function ส่วน partial() function ถูกใช้ในการสร้าง predicate function ใหม่ คือ isCreateNewContent() ซึ่งถูก filter โดย specific type

predicate function คือ function ที่ใช้ค่าเพียงค่าเดียวเป็น input และ return ค่า true/false กลับมา ซึ่งขึ้นอยู่กับว่าค่านั้นเป็นไปตามเงื่อนไขหรือไม่

ข้อสังเกตเกี่ยวกับ predicate function คือ มันมีชื่อตรงกับสิ่งที่มันตั้งใจจะทำ เช่น เมื่อเราอ่าน tasks.filter(isCreateNewContent) เราก็จะเข้าใจได้ทันทีว่า task ใดที่เรากำลังเลือกอยู่

filter() จะเลือกค่าจาก list ตาม predicate function ซึ่งตัดสินว่า ค่าใด ที่ควรจะถูกเก็บ

Reduce

สำหรับเรื่องนี้ ขอใช้ตัวอย่างใหม่โดยใช้ shopping list ซึ่งนี่คือ list ที่มีหน้าตาประมาณนี้:

ถ้าเราต้องการที่จะคำนวณราคารวมและราคาเฉพาะของผลไม้เท่านั้น จากตัวอย่างด้านล่างนี้เป็น imperative style:

หากเราใช้ functional approach ในกรณีนี้ ก็จำเป็นต้องใช้ reduce() เพื่อคำนวณราคาทั้งหมด

reduce() จะทำการลดจำนวนค่าของ list ให้เหลือเพียง 1 ค่า

เหมือนอย่างที่เราทำก่อนหน้านี้ เราจะสร้าง function ใหม่สำหรับการ callback ที่จำเป็น และตั้งชื่อให้ตรงกับสิ่งที่เราต้องการให้มันทำ ซึ่งก็คือ addPrice() และ areFruits()

สรุป

Pure functions จะทำให้อ่านได้ง่ายกว่า สำหรับ Functional Programming จะมีการแบ่ง list operations ออกเป็นทีละ step เช่น filter, map, reduce, sort ในขณะเดียวกัน จะต้องมีการกำหนด pure functions ใหม่ที่มีขนาดเล็กขึ้นมา เพื่อรองรับการดำเนินการตามที่เราต้องการ นอกจากนี้การใช้ Functional Programming ร่วมกับ การตั้งชื่อให้ตรงกับสิ่งที่ต้องการจะให้ทำ จะช่วยให้ code สามารถอ่านและเข้าใจได้ง่ายขึ้น

ที่มา:  https://medium.freecodecamp.org/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความที่เกี่ยวข้อง