Screen Shot 2557-12-06 at 10.43.19 AM
สิ่งหนึ่งที่ developer มักจะพบเจอได้ใน code ของทุกๆ ระบบ
นั่นก็คือ code สำหรับตรวจสอบค่า Null
คุณสมบัติหลักๆ ของ code ส่วนนี้คือ
เป็นเพียงจุดเล็กๆ ที่เกิดขึ้นทั่วไป
และบ่อยครั้งที่ยากต่อการทำความเข้าใจ

ดังนั้น เราควรหลีกเลี่ยงมันดีไหม ?
และควรจะแก้ไขปัญหานี้อย่างไรดีล่ะ ? แต่มันยากนะ !!

มาเริ่มต้นกันดีกว่า

มันเป็นเรื่องที่ง่ายมากๆ สำหรับการบอกว่า code ที่ตรวจสอบค่า Null มันไม่ดี
แต่มันเป็นสิ่งที่ยากมาก สำหรับต้นเหตุของ code ส่วนนี้
รวมทั้งวิธีการแก้ไข หรือ แนวทางอื่นๆ ในการจัดการ

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

ตัวอย่างที่มักเจอบ่อยๆ ในภาษา Java

คำอธิบาย

แน่นอนว่า
เราต้องทำการตรวจสอบ object person ที่ส่งกลับมาว่ามีค่าเป็น Null หรือไม่
ก่อนที่จะทำการเข้าถึงข้อมูลของ object person
ไม่เช่นนั้นจะเกิด NullPointerException ขึ้นมา

code เหล่านี้เกิดขึ้นเป็นเรื่องปกติอย่างมาก ซึ่ง Java developer ทุกๆ คนเคยเขียนแน่นอน

คำถาม
แล้วถ้าไม่ต้องการตรวจสอบ Null ล่ะ จะทำได้อย่างไร ?
คำตอบ
มีวิธีการแก้ไขดังต่อไปนี้

วิธีการที่ 1

ทำให้ method getPersonByID() ของคลาส PersonDAO ไม่ส่ง Null กลับมา
เพียงเท่านี้ก็จบล่ะ นั่นคือ เมื่อไม่พบข้อมูลให้ทำการโยน Exception ออกมาเลย
เช่น PersonNotFoundException เป็นต้น

ตัวอย่างของ code

ในการเรียกใช้งาน ก็สามารถนำการตรวจสอบ Null ออกไปได้เลย

วิธีการที่ 2

ใช้แนวคิด Tell, Don’t Ask ดูหน่อยสิ
เป็นรูปแบบการเขียน code ที่บอกว่าจะให้ทำอะไร โดยที่ไม่ต้องตรวจสอบ Null เลย
ด้วย code ดังนี้

จะเห็นว่าต้องมี interface Action ด้วยดังนี้

ยังไม่วิธีการอื่นอีกนะครับ เช่นพวก Lambda, Optional Monad อะไรพวกนั้น
แต่มันไม่ใช่ประเด็นสำคัญ …

ประเด็นหลักก็คือ

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

สิ่งที่ developer ต้องคิดไว้เสมอ
นั่นก็คือ คุณเป็น Java developer
ซึ่งภาษา Java มันเป็น Object-Oriented Programming นะ
คุณจะมาเขียนในรูปแบบ Structural Programming อยู่กันอีกหรือ ?
ดังนั้น คุณควรจะมาเขียน code ในรูปแบบ

  • การบอกหรืออธิบายว่า จะต้องทำงานอย่างไร
  • มากกว่าจะมาถามว่าต้องทำอย่างไร

ถ้าเอาตัวอย่างนี้ไปเขียนด้วยภาษา Ruby นะ มันจะง่ายมากๆ เพียงเท่านี้

ปิดท้าย

ลองคิดเล่นๆ กันหน่อยว่า ถ้า code มีหน้าตาแบบนี้
เราจะเอาส่วนการตรวจสอบค่า Null ออกไปอย่างไร

Reference Websites

Avoid Null Checks by Replacing Finders with Tellers
Reddit
Avoid null statements in Java

Tags: