ผมได้อ่านเกี่ยวกับ (UN) ความสะดวกสบายของการมีnull
แทน Maybe
(ตัวอย่าง) หลังจากที่ได้อ่านบทความนี้ , ผมเชื่อว่ามันจะดีกว่าที่จะใช้Maybe
(หรือบางสิ่งบางอย่างที่คล้ายกัน) อย่างไรก็ตามฉันรู้สึกประหลาดใจที่เห็นว่าภาษาการเขียนโปรแกรมเชิงวัตถุหรือเชิงวัตถุที่มีชื่อเสียง "ยังคงใช้อยู่null
(ซึ่งอนุญาตการเข้าถึงชนิดที่ไม่ถูกตรวจสอบซึ่งสามารถแสดงถึงค่า 'ไม่มีอะไร') และMaybe
ส่วนใหญ่จะใช้ในภาษาโปรแกรมเชิงฟังก์ชัน
ตัวอย่างเช่นดูรหัส C # ต่อไปนี้:
void doSomething(string username)
{
// Check that username is not null
// Do something
}
มีบางอย่างมีกลิ่นไม่ดีที่นี่ ... ทำไมเราควรตรวจสอบว่าข้อโต้แย้งนั้นเป็นโมฆะหรือไม่ เราไม่ควรคิดว่าทุกตัวแปรมีการอ้างอิงไปยังวัตถุหรือไม่? อย่างที่คุณเห็นปัญหาคือว่าโดยนิยามตัวแปรเกือบทั้งหมดสามารถมีการอ้างอิงที่เป็นโมฆะ เกิดอะไรขึ้นถ้าเราสามารถตัดสินใจว่าตัวแปรใดเป็น "โมฆะ" และไม่ได้? นั่นจะช่วยเราได้มากในขณะที่ทำการดีบั๊กและมองหา "NullReferenceException" ลองจินตนาการว่าโดยค่าเริ่มต้นไม่มีประเภทอาจมีอ้างอิงโมฆะ แทนที่จะเป็นเช่นนั้นคุณจะระบุอย่างชัดเจนว่าตัวแปรสามารถมีการอ้างอิงที่เป็นโมฆะได้เฉพาะในกรณีที่คุณต้องการ นั่นคือความคิดเบื้องหลังบางที หากคุณมีฟังก์ชั่นที่ในบางกรณีล้มเหลว (ตัวอย่างเช่นการหารด้วยศูนย์) คุณสามารถส่งกลับMaybe<int>
ระบุอย่างชัดเจนว่าผลลัพธ์อาจเป็น int แต่ยังไม่มีอะไร! นี่คือเหตุผลหนึ่งที่ต้องการบางทีอาจจะแทนที่จะเป็นโมฆะ หากคุณมีความสนใจในตัวอย่างมากขึ้นแล้วฉันขอแนะนำให้อ่านบทความนี้
ข้อเท็จจริงคือแม้ว่าจะมีข้อเสียของการทำให้ชนิดส่วนใหญ่เป็นโมฆะโดยค่าเริ่มต้นภาษาการเขียนโปรแกรม OO ส่วนใหญ่ทำจริง นั่นคือเหตุผลที่ฉันสงสัยเกี่ยวกับ:
- สิ่งที่ชนิดของการขัดแย้งที่คุณจะมีการดำเนินการ
null
ในการเขียนโปรแกรมภาษาของคุณแทนMaybe
? มีเหตุผลทั้งหมดหรือว่าเป็น "สัมภาระประวัติศาสตร์" หรือไม่?
โปรดให้แน่ใจว่าคุณเข้าใจความแตกต่างระหว่าง null และอาจจะก่อนที่จะตอบคำถามนี้
null
หรือแนวคิดไม่อยู่ (IIRC Haskell เป็นตัวอย่างหนึ่งเช่น)
null
อยู่เป็นเวลานาน มันไม่ง่ายเลยที่จะทำเช่นนั้น