Lambda บน Ruby และ Capybara

เจ้าอาจจะเคยได้ยินเกี่ยวกับ Lambda มา หรือเจ้าอาจจะเคยสัมผัสแล้ว ในภาษาอื่น

นอกจากชื่อประหลาดนี่แล้ว Lambda ก็เป็นแค่ Function… ที่ไร้ชื่อ …นิรนาม

Function นี้ แทรกซึม คลืบคลานไปทั่ว Code ทั้งหมด

Lambda ใน Ruby ก็เป็น Object เช่นกัน ก็เหมือนกับสิ่งอื่นๆ ทั้งหมดนั่นแหละ

สุดท้ายแล้ว Lambda ก็จะ Return ค่า เหมือนกับ Function ทั่วไป

ฟังดูน่าเบื่อ แต่มันจะมอบพลังให้มากมายมหาศาล…

learn more about lambda at rubymonk

Blog นี้จะพูดถึงการใช้งาน Lambda ในฐานะ QA ที่เขียน Automated Testing ด้วย Rspec, Capybara บน Ruby

ซึ่งปกติแล้ว ในการเขียน Feature Spec เราก็ต้องคิดก่อน คล้ายกับเราไปนั่งกด Test อยู่จริงๆ ว่าเราจะทำอะไรบ้าง

ตัวอย่างง่ายๆ เช่น

Test ชุดที่ 1

  • เข้าหน้า New
  • กดที่ปุ่ม FooBar
  • แสดง Flash

Test ชุดที่ 2

  • เข้าหน้า Edit
  • กดที่ปุ่ม Foobar
  • แสดง Flash

จะเห็นว่า เราต้องใช้คำสั่งในการกดปุ่ม FooBar ถึง 2 ครั้ง ซึ่งปกติแล้ว การทำงานง่ายๆ อาจจะไม่มีปัญหามา แต่ในกรณีที่ยากขึ้น

เช่น ในหน้านั้นมีปุ่ม Foobar เยอะมาก หรือ มีเหตุจำเป็นทำให้ไม่สามารถใส่ ID ระบุที่ปุ่มนั้นตรงๆได้ ทำให้การคลิกปุ่มธรรมดายากขึ้น

ตัวอย่าง

[code language="ruby"] find('.class1').find('.class2').all('.class3')[4].find('button', text: 'FooBar').click [/code]

จะเห็นว่า การคลิกธรรมดา  ดูยากขึ้นทันที ทั้งเขียนยาก อ่านยาก เข้าใจยาก และถ้ามีการเปลี่ยนแปลงที่ทำให้เราต้องแก้ไข

เราก็ต้องกลับมาแก้ทั้งหมดที่เราใช้งาน หรือ ถ้าเรามีการทำงานที่ทำซ้ำๆ กัน หลายบรรทัด ก็จะทำให้ Code เรายาวขึ้น และจัดการ

ได้ยากขึ้น ซึ่งเราก็สามารถนำ Lambda มาใช้งานเพื่อให้เราจัดการกับมันได้ง่ายขึ้น

Lambda คืออะไร?

พูดง่ายๆ Lambda ก็คือ Function ชั่วคราว ที่เราตั้งขึ้นมาใน File ที่เราทำงานอยู่ขณะนั้น ใช้รวบรวมการกระทำที่ซับซ้อน และใช้งานบ่อยๆ

และนำไปเรียกใช้แทนการเขียน Code ซ้ำๆ หลายๆ บรรทัด และสามารถแก้ไข ปรับปรุงได้จากที่เดียว

เริ่มต้นเรียกใช้ Lambda เรียกได้ 2 แบบ

[code language="ruby"]
lambda = lambda {}
[/code]

และ

[code language="ruby"] lambda = ->() {} [/code]

โดยส่วนตัวแล้ว ผมจะเรียกใช้แบบล่างมากกว่า และมักจะใช้คู่กับ let ที่บนสุดของ File Spec

ตัวอย่าง

Using of Lambda

จาก Code ข้างบน คือการกด Sub-Panel ที่มี Text ตามที่กำหนด จะเห็นได้ว่า มีการกำหนดตัวแปรที่ใช้

เพื่อให้เวลาเรียกใช้งาน จะกำหนดได้ว่า ให้กด Sub-Panel ที่มีคำว่าอะไร เช่น ให้กด Sub-Panel ที่มีคำว่า Module เวลาเรียกใช้

จะพิมพ์ว่า

[code language="ruby"]subpanel_click.('Module')[/code]

ซึ่งถ้าวันนึง เรามีการเปลี่ยนแปลง Code ในการกด Sub-Panel เราก็แค่มาแก้ที่ Lambda ไม่ต้องแก้ทั้งไฟล์

และยังช่วยให้เราอ่าน จัดการได้ง่ายขึ้นมากๆ ด้วย