ส่วนสำคัญหากคำถามดูเหมือนจะเป็น "ฉันจะคืนข้อมูลสองชิ้นที่ไม่เกี่ยวข้องจากวิธีการที่ส่งกลับ int เดียวได้หรือไม่ฉันไม่ต้องการตรวจสอบค่าตอบแทนของฉันและ null จะไม่ดีอย่าใช้พวกเขา"
ลองดูสิ่งที่คุณต้องการผ่าน คุณกำลังผ่านทั้ง int หรือเหตุผลที่ไม่ใช่ int สำหรับสาเหตุที่คุณไม่สามารถให้ int คำถามยืนยันว่าจะมีเพียงสองเหตุผล แต่ทุกคนที่เคยทำ enum รู้ว่ารายการใด ๆ ที่จะเติบโต ขอบเขตในการระบุเหตุผลอื่น ๆ ก็สมเหตุสมผลแล้ว
ตอนแรกดูเหมือนว่ามันจะเป็นกรณีที่ดีสำหรับการโยนข้อยกเว้น
เมื่อคุณต้องการบอกผู้โทรหาบางสิ่งที่พิเศษซึ่งไม่ได้อยู่ในประเภทส่งคืนข้อยกเว้นมักเป็นระบบที่เหมาะสม: ข้อยกเว้นไม่ได้เป็นเพียงสถานะข้อผิดพลาดเท่านั้นและช่วยให้คุณส่งคืนบริบทและเหตุผลมากมายเพื่ออธิบายว่าทำไมคุณถึงทำได้ วันนี้ int
และนี่คือระบบเท่านั้นที่อนุญาตให้คุณคืนค่า int ที่ถูกต้องและรับประกันได้ว่าตัวดำเนินการ int และวิธีการที่ใช้ ints ทุกตัวสามารถรับค่าตอบแทนของวิธีนี้ได้โดยไม่จำเป็นต้องตรวจสอบค่าที่ไม่ถูกต้องเช่น null หรือค่ามายากล
แต่ข้อยกเว้นเป็นเพียงวิธีแก้ปัญหาที่ถูกต้องเท่านั้นหากตามความหมายของชื่อนี่เป็นกรณีพิเศษไม่ใช่ธุรกิจปกติ
และลอง / จับและจัดการเป็นเพียงมากสำเร็จรูปเป็นเช็คโมฆะซึ่งเป็นสิ่งที่คัดค้านไปในสถานที่แรก
และหากผู้โทรไม่มีการลอง / จับผู้โทรจะต้องดำเนินการต่อไปเรื่อย ๆ
การผ่านครั้งที่สองที่ไร้เดียงสาคือการพูดว่า "เป็นการวัดการวัดระยะทางเชิงลบนั้นไม่น่าเป็นไปได้" ดังนั้นสำหรับการวัดค่า Y คุณสามารถมี const สำหรับ
- -1 = ไม่รู้จัก
- -2 = วัดไม่ได้
- -3 = ปฏิเสธที่จะตอบ
- -4 = รู้จัก แต่เป็นความลับ
- -5 = แตกต่างกันไปขึ้นอยู่กับระยะดวงจันทร์ดูตาราง 5a
- -6 = สี่มิติ, การวัดที่กำหนดในหัวเรื่อง,
- -7 = ข้อผิดพลาดในการอ่านระบบไฟล์
- -8 = สงวนไว้สำหรับใช้ในอนาคต
- -9 = สี่เหลี่ยมจัตุรัส / ลูกบาศก์ดังนั้น Y เท่ากับ X
- -10 = เป็นหน้าจอมอนิเตอร์ดังนั้นจึงไม่ใช้การวัด X, Y: ใช้ X เป็นเส้นทแยงมุมจอภาพ
- -11 = เขียนการวัดลงที่ด้านหลังของใบเสร็จรับเงินและมันถูกฟอกเป็นความไม่ถูกต้อง แต่ฉันคิดว่ามันเป็น 5 หรือ 17
- -12 = ... คุณได้ความคิด
นี่คือวิธีที่มันทำในระบบ C รุ่นเก่าจำนวนมากและแม้แต่ในระบบที่ทันสมัยซึ่งมีข้อ จำกัด อย่างแท้จริงถึง int และคุณไม่สามารถห่อมันไว้กับ struct หรือ monad ของบางประเภท
หากการวัดสามารถเป็นลบได้คุณเพียงแค่ทำให้ประเภทข้อมูลของคุณมีขนาดใหญ่ขึ้น (เช่น int ยาว) และมีค่าเวทมนตร์สูงกว่าช่วงของ int และเริ่มต้นด้วยค่าบางอย่างที่จะปรากฏอย่างชัดเจนในดีบักเกอร์
มีเหตุผลที่ดีที่จะให้พวกมันเป็นตัวแปรแยกต่างหาก ตัวอย่างเช่นการพิมพ์ที่เข้มงวดการบำรุงรักษาและสอดคล้องกับความคาดหวัง
ในความพยายามครั้งที่สามของเราจากนั้นเราจะดูกรณีที่เป็นเรื่องปกติของธุรกิจที่มีค่าที่ไม่ได้ใช้งาน ตัวอย่างเช่นหากการรวบรวมค่าเหล่านี้อาจมีหลายรายการที่ไม่ใช่จำนวนเต็ม ซึ่งหมายความว่าตัวจัดการข้อยกเว้นอาจเป็นวิธีการที่ผิด
ในกรณีนั้นมันดูดีสำหรับโครงสร้างที่ผ่าน int และเหตุผล อีกครั้งเหตุผลนี้อาจจะเป็น const เช่นข้างต้น แต่แทนที่จะถือทั้งสองใน int เดียวกันคุณเก็บไว้เป็นส่วนต่าง ๆ ของโครงสร้าง เริ่มแรกเรามีกฎว่าหากมีการตั้งค่าเหตุผลจะไม่มีการตั้งค่า int แต่เราไม่ได้ผูกติดอยู่กับกฎนี้อีกต่อไป เราสามารถให้เหตุผลสำหรับตัวเลขที่ถูกต้องเช่นกันหากต้องการ
ไม่ว่าจะด้วยวิธีใดก็ตามทุกครั้งที่คุณเรียกใช้คุณยังคงต้องใช้หม้อไอน้ำเพื่อทดสอบเหตุผลเพื่อดูว่า int นั้นใช้ได้หรือไม่จากนั้นดึงและใช้ส่วน int หากเหตุผลให้เรา
ที่นี่คุณจำเป็นต้องตรวจสอบเหตุผลของคุณหลัง "ไม่ใช้ค่าว่าง"
เช่นเดียวกับข้อยกเว้น null หมายถึงสถานะพิเศษ
หากผู้เรียกใช้วิธีนี้และเพิกเฉยต่อส่วน "เหตุผล" ของโครงสร้างอย่างสมบูรณ์คาดว่าจะมีหมายเลขโดยไม่มีข้อผิดพลาดใด ๆ และจะได้รับศูนย์จากนั้นก็จะจัดการกับศูนย์เป็นตัวเลขและจะผิด หากได้รับหมายเลขเวทย์มนตร์มันจะถือว่าเป็นตัวเลขและผิด แต่ถ้ามันเป็นโมฆะมันจะล้มเพราะมันควรจะทำ
ดังนั้นทุกครั้งที่คุณเรียกใช้เมธอดนี้คุณจะต้องทำการตรวจสอบค่าส่งคืน แต่คุณต้องจัดการกับค่าที่ไม่ถูกต้องไม่ว่าจะอยู่ในแบนด์หรือแบนด์ลอง / จับตรวจสอบโครงสร้างสำหรับองค์ประกอบ "เหตุผล" ตรวจสอบอิน สำหรับหมายเลขมายากลหรือตรวจสอบ int สำหรับ null ...
ทางเลือกในการจัดการการคูณของเอาต์พุตซึ่งอาจมี int ที่ไม่ถูกต้องและเหตุผลเช่น "สุนัขของฉันกินการวัดนี้" คือการโอเวอร์โหลดตัวดำเนินการคูณสำหรับโครงสร้างนั้น
... จากนั้นให้ผู้ให้บริการรายอื่นเกินพิกัดในแอปพลิเคชันของคุณที่อาจนำไปใช้กับข้อมูลนี้
... และเกินวิธีการทั้งหมดที่ใช้ ints
... และโอเวอร์โหลดเหล่านั้นทั้งหมดจะต้องยังคงมีการตรวจสอบ int ที่ไม่ถูกต้องเพียงเพื่อให้คุณสามารถรักษาชนิดคืนของวิธีนี้ราวกับว่ามันเป็น int ที่ถูกต้องเสมอเมื่อคุณเรียกมัน
ดังนั้นหลักฐานดั้งเดิมจึงเป็นเท็จในหลายวิธี:
- หากคุณมีค่าที่ไม่ถูกต้องคุณจะไม่สามารถหลีกเลี่ยงการตรวจสอบค่าที่ไม่ถูกต้องได้ทุกเมื่อในรหัสที่คุณจัดการค่า
- หากคุณส่งคืนสิ่งอื่นนอกเหนือจาก int คุณจะไม่ส่งคืนค่า int ดังนั้นคุณจะไม่สามารถปฏิบัติได้เหมือน int ผู้ประกอบการมากไปช่วยให้คุณแกล้งแต่นั่นเป็นเพียงการแกล้ง
- int ที่มีตัวเลขเวทย์มนตร์ (รวมถึง NULL, NAN, Inf ... ) ไม่ได้เป็น int จริงๆอีกต่อไปมันเป็นโครงสร้างของคนยากจน
- การหลีกเลี่ยงค่า Null จะไม่ทำให้รหัสมีเสถียรภาพมากขึ้น แต่จะซ่อนปัญหากับ ints หรือย้ายไปไว้ในโครงสร้างการจัดการข้อยกเว้นที่ซับซ้อน