มีเหตุผลใดที่จะไม่ใช้ตัวเลือกเป็นอาร์กิวเมนต์วิธีในกรณีที่คุณรู้ว่าอาร์กิวเมนต์เป็นสิ่งที่อาจหรือไม่จำเป็น?


11

ด้วย Java 8 ฉันได้เห็นบทความมากขึ้นเกี่ยวกับการใช้ตัวเลือก / ตัวเลือก ฉันเข้าใจสิ่งที่พวกเขาพยายามเป็นตัวแทนและฉันเห็นตัวอย่างมากมายของพวกเขาที่ใช้เป็นผลตอบแทน อย่างไรก็ตามสิ่งที่ฉันไม่เห็นก็คือพวกมันถูกใช้เป็นข้อโต้แย้งเมธอด / ฟังก์ชั่นในภาษาที่ไม่มีไวยากรณ์สำหรับพารามิเตอร์เริ่มต้น / ทางเลือก

มีเหตุผลใดที่จะไม่ใช้Optionalเป็นอาร์กิวเมนต์วิธีในกรณีที่คุณรู้ว่าอาร์กิวเมนต์เป็นสิ่งที่อาจหรืออาจไม่จำเป็น? นี่คือตัวอย่างที่ฉันคิดได้:

Optional<Customer> lookupCustomer(String firstName, Optional<String> middleName, String lastName)

นี่คือการใช้งานทั่วไปสำหรับพวกเขาใน Haskell ซึ่งไม่มีข้อโต้แย้งเริ่มต้น
Daniel Gratzer

ดูคำตอบของฉันสำหรับคำถาม Stack Overflow ที่เกี่ยวข้อง สั้น ๆOptionalมีวัตถุประสงค์หลักสำหรับค่าตอบแทนที่อาจขาด การใช้งานอื่น ๆ นั้นเป็นไปได้แน่นอน แต่มีความยุ่งยากและน่าจะเป็นรูปแบบที่ไม่ดี
Stuart Marks

คำตอบ:


6

เหตุผลหนึ่งคือแนวคิด, firstNameและmiddleName, lastNameเป็นเหตุผลหนึ่งข้อโต้แย้งไม่ใช่สาม พวกมันล้วนเป็นส่วนที่ใหญ่กว่าและเราก็จินตนาการได้ว่าพวกมันเกือบจะผ่านเข้าด้วยกัน ในภาษาที่ใช้งานได้พวกมันจะถูกส่งผ่านเป็น tuple หรือบันทึก Java ขาดเหล่านั้นดังนั้นพวกเขาอาจจะรวมเข้ากับคลาสชื่อ โปรดทราบว่าหากคุณต้องการเขียนฟังก์ชั่นที่รับและส่งคืนชื่อเต็มคุณจะไม่สามารถรวบรวมได้ - คุณสามารถส่งคืนได้หนึ่งค่าเท่านั้น

บางทีมันอาจจะไม่ได้เกิดขึ้นบ่อยครั้งที่ค่าเป็นทางเลือกและไม่ได้เป็นส่วนหนึ่งของภาพรวมที่ใหญ่กว่า ถ้าฟังก์ชันต้องมีOptionalค่าบางอย่างที่จะทำงานของมันแล้วฟังก์ชั่นที่ไม่ควรจะยอมรับ หากคุณต้องการเชื่อมโยงการดำเนินการที่อาจไม่ส่งคืนค่ายกเลิกด้วยNothingถ้าฟังก์ชั่นใด ๆ ที่ล้มเหลวคุณสามารถโทรไปยังflatMapและหากคุณต้องการล้มเหลวด้วยข้อยกเว้นที่คุณสามารถใช้get()ในขั้นตอนใด ๆ หรือ จุดสิ้นสุดของห่วงโซ่

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

ฉันไม่คิดว่ามันมากจนผิดเพราะเป็นกรณีการใช้งานที่ค่อนข้างแปลก


5

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.