วันพุธที่ ๔ กรกฎาคม พ.ศ. ๒๕๕๐

ศิลปะการใช้ If (Art of If Statement)

บางคนอาจจะถามว่า จะเขียนทำไม ไอ้เรื่องกล้วยๆ ขนาดนี้ ซึ่งผมก็ไม่เถียงครับ เพราะมันเป็นพื้นฐานของตรรกะการเขียนโปรแกรมอยู่แล้ว แต่สิ่งที่ผมจะเอามาบอกไม่ใช่มาอธิบาย เรื่อง If ใช้งั้นยังครับ แต่เป็นรูปแบบ If ที่สามารถเขียนได้หลายรูปแบบ บางรูปแบบหลายๆ คนอาจจะยังไม่เคยเห็นเลยนะ้ครับ... น่าสนใจแล้วใช่ไหมครับ งั้นเราลองมาดูกันว่ามีอะไรบ้าง เริ่มจากที่เห็นบ่อยๆ ไปจนถึงที่ไม่ค่อยเห็นครับ

1. แบบมี End If (หรือแบบหลายบรรทัด)
1.1) If ... End If
รูปแบบนี้ เราจะตรวจสอบและเขียนคำสั่ง กรณีผลลัพธ์ของเงื่อนไขเป็น True เท่านั้น เช่น

'กรณีผลลัพธ์ของเงื่อนไขเป็น False คำสั่งถัดไปจะเป็น End If ทันที
If ValueA > 2 Then
ValueA -= 1
ValueB = 3
End If


1.2) If ... Else ... End If
รูปแบบนี้ เราจะตรวจสอบและเขียนคำสั่ง ที่ผลลัพธ์ของเงื่อนไขเป็นทั้ง True และ False เช่น

If ValueA <> 3 Then
ValueB += 1
Else
ValueB -= 1
End If


1.3) If ... ElseIf ... Else ... End If
รูปแบบนี้จะให้เราใส่เงื่อนไขเข้าไปหลายๆ ตัวได้ คล้ายๆ Select Case ส่วน Else จะใสหรือไม่ก็ได้ แต่ถ้าไม่ใส่จะเป็นการเขียนโปรแกรมที่ไม่ดี เพราะกรณีเงื่อนไขใดๆ ไม่มีผลลัพธ์เป็น True เลย ก็อาจจะเกิดปัญหา logic error หรือ flow ไม่เป็นไปตามต้องการก็ได้ จึงควรเขียนดักไว้ก่อน เพื่อให้ถูกหลักการเขียนโปรแกรมที่ดี (อาจมีเหตุการณ์แปลกๆ ที่ทำให้มี input data แปลกๆ เข้ามาในโปรแกรมเรา กันไว้ดีกว่าแก้ครับ) ตัวอย่างการใช้

If MyCountry = "Thailand" Then
MyCountry = "ประเทศไทย"
ElseIf MyName = "Japan" Then
MyCountry = "ประเทศญี่ปุ่น"
ElseIf MyName = "China" Then
MyCountry = "ประเทศจีน"
Else
MyCountry = "บุคคลไร้สัญชาติ"
End If


2. แบบไม่มี End If (หรือแบบบรรทัดเดียว)
2.1) If ... Then ...
เป็นรูปแบบที่สั้นที่สุด และหวังผลให้ทำงานเฉพาะผลลัพธ์ของเงื่อนไขที่เป็น True เท่านั้น แต่คำสั่งหลัง Then มีได้แค่ 1 statement เท่านั้น ตัวอย่างเช่น

If Number = 10 Then MsgBox("Value is " & Number)

2.2) If ... Then ... Else ...
รูปแบบ If บรรทัดเดียว ที่ทำงานกับผลลัพธ์ชองเงื่อนไข ทั้ง True และ False แต่คำสั่งหลัง Then และ Else ก็ยังต้องมีเพียง 1 statement เท่านั้น เช่น

If Score <= 49 Then Grade = "S" Else Grade = "P"


2.3) If ... Then ... : ... : ...
รูปแบบ If บรรทัดเดียว ที่ทำงานกับผลลัพธ์ชองเงื่อนไขที่เป็น True แต่สามารถเขียนหลายๆ statement หลัง Then ได้ โดยมีเครื่องหมานโคล่อน (:) ระหว่าง statement

If Sex = True Then SexString = "Man" : MsgBox("Sex is " & SexString)

2.4) If ... Then ... : ... : ... Else ... : ... : ...
รูปแบบที่เหมือนข้อ 2.3 แต่ทำงานกับผลลัพธ์ชองเงื่อนไข ทั้ง True และ False และเขียนหลายๆ statement หลังตรวจสอบการเงื่อนไข ได้เหมือนกัน

If Value > 3 Then X *= 2 : Y *= 3 Else X *= 3 : Y *=2 : Z *= 2

3. แบบ IIf (อ่านว่า If and only If)
รูปแบบนี้จะมีการ return ค่าหลังจากตรวจสอบเงื่อนไข ซึ่งเขียนได้ในบรรทัดเดียวด้วย รูปแบบเป็นดังนี้ IIF(เงื่อนไข, ค่าเมื่อเงื่อนไขเป็นจริง, ค่าเมื่อเงื่อนไขเป็นเท็จ) ตัวอย่างเช่น

'คำสั่ง IIf จะทำงานเหมือน call function
Price = IIf(IsMember, Price - (Price * 0.1), Price - (Price * 0.05))

เทคนิคเพิ่มเติม
เพื่อให้การเขียนแต่ละบรรทัดไม่ยาวเกินไป เราอาจจะใช้เครื่องหมาย underscore (_) เพื่อขึ้นบรรทัดใหม่ แต่ compiler จะตีความเป็นเหมือนบรรทัดเดียว ทำให้โค้ดมีระเบียบและมีประสิทธิภาพดี เช่น

'โค้ดข้างล่างนี้ มีรูปแบบเหมือนข้อ 2.1
If
(CustomerItem => 3) Or (CustomerTotal > 2000) _
Or (CustomerBirthday = Now) Or (IsMember) Then _
Price -= Price * 0.1

หมายเหตุ
ถ้าใช้เหตุผลทาง Software Engineering แล้ว รูปแบบที่ 2.3 และ 2.4 ไม่ควรนำมาใช้เป็น Coding Standard สำหรับการผลิตซอฟต์แวร์ขนาดใหญ่ บางที่อาจเข้มงวดมาก โดยให้ใช้เพียงแค่รูปแบบที่ 1 ยังไงก็ใหเรียนรู้ไว้บ้างก็ดี เพราะซอฟต์แวร์บางตัวก็อาจจะเน้น performance มากๆ หรือเป็นโปรแกรมไม่ใหญ่ จะได้มีลกูเล่นไว้สร้างสีสันบ้าง ยิ่งเป็น junior ยิ่งควรต้องศึกษา เผื่อต้องทำงานร่วมกับ senior ที่มีนิสัยชอบ advance coding (คำเตือน - ไม่ควรเขียนโปรแกรมแกล้งรุ่นน้อง เพราะอาจได้รับการกราบไหว้ แต่ไม่มีใครอยากทำงานด้วย 555...)

Related Post