Screen Shot 2558-07-22 at 8.01.12 PM
อ่านเจอบทความเรื่อง Defensive programming in PHP อธิบายได้อย่างน่าสนใจ
แต่ก่อนอื่นมาทำความรู้จักกับ Defensive programming กันหน่อย
ว่ามันคืออะไร ?
มันดี หรือ ไม่ดีอย่างไร ?
ลอง คิด วิเคราะห์ แยกแยะ กันดูครับ

Defensive programming คืออะไร ?

จาก Wikipedia อธิบายไว้ว่า

is a form of defensive design intended to ensure the continuing function of a piece of software in spite of unforeseeable usage of said software. The idea can be viewed as reducing or eliminating the prospect of Murphy’s Law having effect. Defensive programming techniques are used especially when a piece of software could be misused mischievously or inadvertently to catastrophic effect.

แนวคิดนี้มีเป้าหมายเพื่อปรับปรุง code และ software ประกอบไปด้วย

  • เรื่องคุณภาพ นั่นคือการลดจำนวนของ bug และ error
  • ทำให้ code มันเข้าใจได้ง่ายขึ้น อ่านได้ง่ายขึ้น
  • ทำให้ software ที่เราสร้างขึ้นมานั้น รองรับเหตุการณ์ที่คาดไม่ถึงได้ ทั้ง input และ การใช้งานจากผู้ใช้งาน

ซึ่งบางครั้งอาจจะเรียกว่า Secure programming

แต่ถ้าทำมากจนเกินไป หรือ Over Defensive Programming

ก็จะทำให้เกิด code ที่ไม่ต้องการจำนวนมากมาย
หรือ code เกิดขึ้นมา เพราะใช้ตรวจสอบ error ต่างๆ ที่อาจจะไม่เกิดขึ้นก็ได้
หรือเพิ่มจำนวน code มามากเกินไป
หรือ code มันยากต่อการแก้ไข
หรือ อาจจะซ่อน bug, error ต่างๆ
ซึ่งนั่นคือ การเพิ่มค่าใช้จ่ายในเรื่องของการดูแล และ ทำงาน เช่นกัน

ดังนั้น เราควรต้องสร้างสมดุลในการนำมาใช้งานด้วยนะ

มาดูตัวอย่าง การเขียน code ที่น่าจะตามแนวคิดนี้กันดูหน่อย !!

1. เขียน code ที่ไม่จำเป็น

คำถาม
เราจะตรวจสอบค่า null ของค่าในตัวแปล name ไปทำอะไร ?
มันมีประโยชน์อะไร ?
ทั้งๆ ที่การเรียกใช้งาน method newPerson() นั้นก็ส่งค่า name ที่ไม่เป็น null มาเสมอ !!

ดังนั้น ลด ละ เลิก เถอะนะ !!
หัดไว้ใจใน code หรือ การทำงานของ code หน่อย
แปลกแต่จริง … ถึงแม้ว่า code เราจะเขียนเองก็ตามแต่เราต้องตรวจสอบเสมอ

นี่คือ สิ่งแรกที่พบเจอกับ Defensive programming ที่มากเกินไป

2. การตรวจสอบ Null

เป็นปัญหาคล้ายๆ ตัวอย่างแรก แต่หนักกว่า
ส่งผลทำให้ได้ code ที่น่าเกลียดออกมา
เรามักจะเจอ code เหล่านี้ในส่วนของ utility class อีกด้วย
ตัวอย่างเช่น

คำถาม
ทำไมต้องตรวจสอบค่า null ของ 2 parameter ด้วยล่ะ ?
คำตอบ
เพราะว่าขั้นตอนการ add friend นั้น
จะทำงานได้ก็ต่อเมื่อทั้งคู่ไม่เป็น null นะสิ ถามได้ !!
ไม่เช่นนั้นก็เกิด NullPointerException นะ

คำถาม
ทำไมผู้เรียกใช้งาน method นี้ ถึงเรียกเมื่อ paramater มันเป็น null ล่ะ ?
ทำไมผู้ใช้งานไม่ตรวจสอบเองล่ะ ?
การตรวจสอบใน method แสดงว่า คุณกำลังซ่อนการทำงานบางอย่างใช่ไหม ?

ยังไม่พอนะ ยังมีcode การตรวจสอบ null ที่สนุกแบบนี้อีก

คำถาม
code ที่เขียนแบบนี้คุณสนใจอะไร ?
คุณจะตรวจสอบ null ไปทำไมเยอะ ?
สิ่งที่คุณทำไปนั้น มันจำเป็นหรือไม่ ?

คำถาม
code มันอ่านง่ายไหม ?
code มันเข้าใจง่ายไหม ?
code มันดูแลรักษาง่ายไหม ?
code มันแก้ไขได้ง่ายไหม ?

ดังนั้น ลองถามตัวเองก่อนเขียน code เหล่านี้ขึ้นมา หน่อยสิว่า

  • code ที่เขียนขึ้นมา มันจำเป็นไหม ?
  • จำเป็นไหมในการตรวจสอบค่า null ?

อย่าบอกว่าคุณทำ defensive programming
ถ้าคุณไม่ต้องการเห็น error อะไรเลย
ถ้าคุณยังซ่อน error หรือ การทำงานต่างๆ ไว้
ถ้าคุณเขียน code ที่ไม่ได้ช่วยเหลือใครเลย
ถ้าคุณเขียน code ไว้ทำร้ายตัวเอง และ คนอื่นๆ

ลองกลับไปดูสิว่า คุณกำลังทำอะไรกันอยู่ ?