วัน: 17 ธันวาคม 2017

Rule Engine: Decision TableRule Engine: Decision Table

ในการออกแบบซอฟต์แวร์หรือการสร้างเงื่อนไขทางธุรกิจ (Business Rules) บ่อยครั้งที่เราต้องเจอกับเงื่อนไขที่ซ้อนกันหลายชั้นจนเริ่มงง การใช้ Decision Table (ตารางการตัดสินใจ) จึงเป็นเทคนิคที่ช่วยเปลี่ยน Logic ที่ยุ่งเหยิงให้กลายเป็นตารางที่อ่านง่าย ครบถ้วน และลดความผิดพลาดได้ดีเยี่ยมครับ


Decision Table คืออะไร ?

Decision Table คือเครื่องมือในรูปแบบตารางที่ใช้แสดงความสัมพันธ์ระหว่าง “เงื่อนไข” และ “ผลลัพธ์ / การกระทำ” โดยจะแจกแจงทุกความเป็นไปได้ออกมาเป็นกรณี ๆ ไป เพื่อให้มั่นใจว่าเราไม่ได้ตกหล่นสถานการณ์ใดสถานการณ์หนึ่งไป


ส่วนประกอบหลักของตาราง

  1. Condition Stub: รายการเงื่อนไขที่เราต้องพิจารณา
  2. Action Stub: รายการผลลัพธ์หรือสิ่งที่ต้องทำ
  3. Condition Entry : ค่าของเงื่อนไขในแต่ละกรณี
  4. Action Entry: ตัวบอกว่าใน Rule นั้น ๆ จะเกิด Action ใดขึ้น

ขั้นตอนการสร้าง Decision Table

สมมติเราต้องการทำระบบ “คำนวณส่วนลดร้านอาหาร” โดยมีเงื่อนไขคือ

  • ถ้าเป็นสมาชิก และ ยอดเกิน 500 บาท -> ลด 15%
  • ถ้าเป็นสมาชิก แต่ ยอดไม่ถึง 500 บาท -> ลด 5%
  • ถ้าไม่เป็นสมาชิก แต่ ยอดเกิน 500 บาท -> ลด 5%
  • นอกเหนือจากนี้ -> ไม่ลดเลย

การทำงาน

  1. ระบุเงื่อนไขและผลลัพธ์
    • Conditions:
      1. เป็นสมาชิก ?
      2. ยอด > 500 ?
    • Actions:
      1. ลด 15%
      2. ลด 5%
      3. ราคาปกติ
  2. คำนวณจำนวน Rule
    เนื่องจากมี 2 เงื่อนไข ดังนั้นจะมีทั้งหมด 22 = 4 กรณี
    ConditionsRule 1Rule 2Rule 3Rule 4
    เป็นสมาชิก ?YYNN
    ยอดซื้อ > 500 ?YNYN
    Actions
    ส่วนลด 15%X
    ส่วนลด 5%XX
    ราคาปกติX
  3. การอ่าน Decision Table ให้เข้าใจง่ายที่สุด คือการมองว่ามันคือ “แผนที่นำทาง” ที่เชื่อมโยงระหว่าง “เหตุ” และ “ผล” ครับ โดยเราจะอ่านไล่จาก บนลงล่าง และ ซ้ายไปขวา ตามลำดับ ดังนี้ครับ
    • การอ่านแนวตั้ง
      หัวใจสำคัญของตารางนี้คือ Rule ซึ่งมักจะอยู่ตามแนวคอลัมน์ ให้คุณเลือกอ่านทีละคอลัมน์เพื่อดูว่า “ถ้าเกิดเหตุการณ์แบบนี้ ผลลัพธ์จะเป็นอย่างไร”
      • ส่วนบน : อ่านจากบนลงล่างเพื่อดูว่าเงื่อนไขใน Rule นั้น ๆ เป็นอย่างไร
      • ส่วนล่าง : เมื่อเงื่อนไขด้านบนครบถ้วน ให้มองลงมาด้านล่างที่มีเครื่องหมาย X หรือ Checkmark นั่นคือสิ่งที่จะเกิดขึ้น
        • ตัวอย่าง: ใน Rule 1 ถ้า “เป็นสมาชิก = ใช่” และ “ยอดซื้อ > 500 = ใช่” ผลลัพธ์ที่ได้คือ “ส่วนลด 15%”
    • การอ่านแนวนอน
      การอ่านตามแถว จะช่วยให้เราเห็นภาพรวมของระบบว่ามีตัวแปรอะไรบ้างที่ส่งผลต่อการตัดสินใจ
      • แถวของ Condition: ช่วยให้เห็นว่าแต่ละเงื่อนไขมีความถี่หรือความสำคัญอย่างไร
      • แถวของ Action: ช่วยให้เห็นว่าผลลัพธ์หนึ่ง ๆ เกิดขึ้นได้จากกี่กรณีบ้าง
    • เทคนิคการไล่ลำดับสำหรับมือใหม่
      หากคุณได้รับตารางมาแล้วต้องวิเคราะห์ ให้ใช้หลักการ “ถ้า… แล้ว…” (If… Then…) ดังนี้
      1. สแกนหา Rule: เลือกมา 1 คอลัมน์
      2. ตั้งประโยค If: “ถ้า และ และ …”
      3. สรุปด้วย Then: “…แล้ว (Action ที่มีเครื่องหมาย X) จะถูกดำเนินการ”

ทำไมเราถึงควรใช้ Decision Table ?

  • ป้องกันความสับสน: เมื่อเงื่อนไขเยอะเกินกว่าที่ If-Else ในหัวจะรับไหว ตารางจะช่วยจัดระเบียบความคิดได้ดีมาก
  • ตรวจสอบความครบถ้วน : ช่วยให้เห็นว่าเราลืมเขียนโปรแกรมดักกรณีไหนไปหรือเปล่า
  • สื่อสารง่าย: ใช้คุยกับทีม Business หรือลูกค้าได้เข้าใจตรงกันโดยไม่ต้องเปิด Code ให้ดู
  • ลด Logic ที่ซ้ำซ้อน: บางครั้งเราจะเห็นว่าหลาย Rule ให้ผลลัพธ์เหมือนกัน ทำให้เรายุบรวมเงื่อนไข ได้

ข้อควรระวัง

หากเงื่อนไขมีจำนวนมากเกินไป ตารางจะขยายใหญ่ขึ้นมหาศาล ในกรณีนี้ควรแยกตารางออกเป็นตารางย่อย ๆ ตามโมดูลแทนครับ


อ่านเพิ่มเติม