ถ้าจะผ่านไป ข้ามศพฉันไปก่อน!!! รู้จักกับ Guard ใน Swift 2.0
ขึ้นหัวข้อซะเหมือนกับภาพยนต์เลย ว่าแต่มันเกี่ยวอะไรกับ Swift หละ? เกี่ยวแน่ ไม่งั้นจะเขียนทำไมเนอะ? 555
จริงๆแล้วประโยคว่า “ถ้าจะผ่านไป ข้ามศพฉันไปก่อน!!!” แว๊บขึ้นมาในหัวผมทันทีที่ได้รู้จักกับความสามารถใหม่ที่เพิ่มเข้ามาใน Swift 2.0 นั่นก็คือ Guard ซึ่งชื่อมันก็บอกโต้งๆแปลว่า ยาม, เครื่องป้องกัน, ผู้คุ้มกัน
สำหรับ Guard นั้น การใช้งานจะคล้ายๆกับ If นั่นแหละ คือการทำงานต่อไปได้นั้นจะขึ้นอยู่กับ ค่าความ จริง หรือ เท็จ (Boolean)
แล้ว Guard ใช้ในกรณีไหน?
เราจะใช้ guard ในกรณีที่เราจะต้องเขียน Code การทำงานต่างๆ หลังจากได้ทำการตรวจสอบเงื่อนไขว่าเป็นจริงแล้ว ความแตกต่างจาก If-statement คือ guard นั้นจะมีบล็อกให้เราเขียน Code การทำงานในกรณีที่เงื่อนไขเป็นเท็จเท่านั้น
เรามาดูตัวอย่างกันดีกว่า
ผมต้องการที่จะตรวจสอบ ข้อมูลบัตรเครดิตที่ผู้ใช้ป้อนเข้ามาในระบบ ว่ามีข้อมูลครบถ้วน และถูกต้องตามข้อกำหนดหรือไม่ ก็สร้าง class สำหรับเก็บข้อมูลบัตรลูกค้าไว้
จะเห็นได้ว่า เราได้ข้อมูลบัตรเครดิตของลูกค้า มาเก็บไว้ใน CustomerCardInfo object ซึ่งประกอบไปด้วย ชื่อ, เลขบัตรเครดิต, ชื่อธนาคาร และ รหัส CCV
เงื่อนไขในการตรวจสอบคือ
1. ต้องมีข้อมูลครบถ้วนทุกตัว
2. หากมีข้อมูลครบถ้วน ให้ตรวจสอบ จำนวนของเลขบัตรเครดิต และ รหัส CCV ว่าตรงไปตามข้อกำหนดหรือเปล่า (เลขบัตร 16, รหัส CCV 3)
ซึ่งผมสามารถเขียนฟังก์ชั่นในการตรวจสอบความครบถ้วน ด้วย If-Else แบบปกติได้ดังนี้
จาก Code ด้านบน เราทำการตรวจสอบเงื่อนไขแรกว่า ข้อมูลทั้งหมด ต้องมีค่าเท่านั้น และ นำค่าเหล่านั้นมาตรวจสอบเงื่อนไขครั้งที่ 2 หากเป็นจริง ก็จะ return กลับไป และจบฟังก์ชั่น
ซึ่งก็ปกติแล้วหนิ ไม่เห็นจะต้องมี guard เพิ่มมาเลย?
ก็จริงครับ แต่ลองนึกดูว่า หากเราไม่ได้มีเงื่อนไขแค่สองอย่างหละ หากมีเป็น 10 เราก็จะต้องมี If-Else ซ้อนกันไปเรื่อยๆใน Code ของเรา (Pyramid of doom) มาทำให้ Code อ่านยาก หากวันนี้เราต้องการจะเปลี่ยนเงื่อนไขก็ลำบากเอาการ ซึ่งแน่นอน หากมี Bug ขึ้นมา ก็ต้องมานั่งไล่กันปวดตา
ทีนี้ลองมาใช้ Guard
“ถ้าจะผ่านไป ข้ามศพฉันไปก่อน!!!” พอจะเข้าใจผมหรือยัง ว่าทำไมถึงนึกถึงประโยคนี้?
เมื่อใช้ guard มาช่วย Code ของเราจะสะอาดตากว่า ดูเป็นสัดส่วน เงื่อนไข ทั้งสอง ถูกวางดักไว้เป็นระแบบ เหมือนกำแพง หรือ กลุ่มทหารกล้ายืนเรียงแถวคอยคุ้มกันส่วนหน้าไว้อย่างแน่นหนา ยากที่ใครจะผ่านเข้ามาได้ หากวันนึงมีการเปลี่ยนเงื่อนไข ก็สามารถยกทั้งหมดขึ้นรถไปและเปลี่ยนกลุ่มใหม่เข้ามาแทนได้ทันที
นอกจากนั้น ตัวแปร Optional ต่างๆ ที่ผ่าน guard มาแล้วนั้น จะถูก unwrap มาเรียบร้อยแล้ว ทำให้เราสามารถใช้งานมาในการเขียน code การทำงานต่างๆใต้ guard ได้เลย แตกต่างกับ If ตัวแปรที่ถูก unwrap จะใช้ได้แค่ใน scope ของ If ที่เงื่อนไขเป็นจริงเท่านั้น
ลองใช้ดูนะครับ ผมต้องขอตัวไปซื้อกาแฟฝากยามหน้าที่ทำงานก่อน