ใช้รูปแบบวัตถุ Null ไม่ลอง/จับบล็อก

May 01 2023
รูปแบบวัตถุว่างเป็นรูปแบบการออกแบบที่ใช้เพื่อจัดการกับกรณีและปัญหาเมื่อวัตถุเป็นโมฆะหรือไม่ได้กำหนด แนวคิดพื้นฐานเบื้องหลังรูปแบบคือการสร้างวัตถุว่างที่มีอินเทอร์เฟซเดียวกันกับวัตถุดั้งเดิม แต่ไม่ทำอะไรเลยเมื่อมีการเรียกใช้เมธอด

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

หากเราไม่ทราบรูปแบบวัตถุว่าง เราจะเขียนโค้ดเพื่อจัดการกับสถานการณ์ข้อผิดพลาดด้วยtry/catchวิธีการดังต่อไปนี้:

ผลลัพธ์ของโค้ดด้านบนคือ:

An error occurred creating the account: Username is required

ปัญหาของโค้ดข้างบนคือ ทุกครั้งที่ใช้create_accountเราต้องใช้try/catchเพื่อดักจับข้อยกเว้น หากเราต้องใช้create_accountหลายครั้งในบางโปรเจกต์ การจัดการจะค่อนข้างซับซ้อน

จะแก้ปัญหาการลอง/จับด้านบนได้อย่างไร

นี่คือเมื่อรูปแบบวัตถุว่างเข้ามาใช้ ลองขยายกรณีข้างต้นไปสู่การใช้งานจริงมากขึ้น

หากเราใช้try/catchบล็อกเพื่อเพิ่มข้อยกเว้น:

หากต้องการใช้รูปแบบวัตถุว่าง:

หลังจากการปรับโครงสร้างใหม่ข้างต้น เราได้ทำให้calculate_total_balanceฟังก์ชันง่ายขึ้นโดยใช้รูปแบบออบเจกต์class NullAccountnull เราไม่ต้องการtryบล็อกเพื่อจัดการกับข้อผิดพลาด และเราสามารถสรุปได้ว่าสิ่งนั้นAccount.from_stringจะส่งคืนวัตถุที่ถูกต้องเสมอ

ซึ่งช่วยให้รหัสไคลเอนต์ปฏิบัติต่อวัตถุว่างเหมือนวัตถุจริง โดยไม่ต้องตรวจสอบNoneหรือnullหาค่าตลอดเวลา ออบเจกต์ null มีลักษณะการทำงานเริ่มต้นที่ปลอดภัย และสามารถใช้เป็นตัวยึดได้จนกว่าจะมีออบเจกต์จริง

เหตุใด Go จึงไม่มีรูปแบบวัตถุว่าง

ใน Go เป็นเรื่องปกติที่จะคืนค่าหลายค่าจากฟังก์ชัน โดยค่าที่สองจะเป็นบูลีนที่บ่งชี้ว่าสำเร็จหรือล้มเหลว รูปแบบนี้เรียกว่ารูปแบบ "comma-ok" หรือ "tuple" ตัวอย่างเช่น ฟังก์ชันที่ค้นหาคีย์ในแผนที่สามารถส่งคืนค่าและบูลีนที่ระบุว่าพบคีย์หรือไม่ วิธีการนี้ทำให้ไม่จำเป็นต้องใช้รูปแบบวัตถุว่าง

นอกจากนี้ Go ยังมีค่าในตัวnilซึ่งสามารถใช้เพื่อแสดงค่าที่ไม่มีอยู่หรือไม่มีค่า Go สนับสนุนให้ใช้nilค่านี้แทนการใช้รูปแบบออบเจกต์ที่เป็นค่าว่าง เนื่องจากจะทำให้โค้ดง่ายขึ้นและลดความซับซ้อน