ฉันได้อ่านบนเว็บไซต์หลายแห่งทางเลือกควรใช้เป็นประเภทส่งคืนเท่านั้นและไม่ได้ใช้ในการโต้แย้งเมธอด ฉันกำลังดิ้นรนเพื่อหาเหตุผลเชิงเหตุผล ตัวอย่างเช่นฉันมีชิ้นส่วนของตรรกะซึ่งมี 2 พารามิเตอร์ทางเลือก ดังนั้นฉันคิดว่ามันสมเหตุสมผลที่จะเขียนลายเซ็นวิธีของฉันเช่นนี้ (โซลูชันที่ 1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
หน้าเว็บจำนวนมากระบุตัวเลือกที่ไม่ควรใช้เป็นข้อโต้แย้งวิธี ด้วยสิ่งนี้ในใจฉันสามารถใช้ลายเซ็นวิธีการต่อไปนี้และเพิ่มความคิดเห็น Javadoc ที่ชัดเจนเพื่อระบุว่าอาร์กิวเมนต์อาจเป็นโมฆะหวังว่าผู้ดูแลในอนาคตจะอ่าน Javadoc ดังนั้นจึงต้องทำการตรวจสอบ null ก่อนที่จะใช้อาร์กิวเมนต์ (โซลูชัน 2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
หรือฉันสามารถแทนที่วิธีของฉันด้วยวิธีสาธารณะสี่วิธีเพื่อให้อินเทอร์เฟซที่ดีกว่าและทำให้ p1 และ p2 ชัดเจนยิ่งขึ้นเป็นตัวเลือก (โซลูชัน 3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
ตอนนี้ฉันลองเขียนโค้ดของคลาสที่เรียกใช้ตรรกะนี้สำหรับแต่ละวิธี ครั้งแรกที่ผมดึงป้อนพารามิเตอร์สองคนจากวัตถุอื่นซึ่งผลตอบแทนและแล้วผมวิงวอนOptional
calculateSomething
ดังนั้นหากใช้โซลูชัน 1 รหัสการโทรจะเป็นดังนี้:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
หากใช้โซลูชัน 2 รหัสการโทรจะมีลักษณะดังนี้:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
หากมีการใช้โซลูชัน 3 ฉันสามารถใช้รหัสด้านบนหรือฉันสามารถใช้รหัสต่อไปนี้ (แต่เป็นรหัสที่มีความหมายมากกว่า):
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
if (p2.isPresent()) {
result = myObject.calculateSomething(p1, p2);
} else {
result = myObject.calculateSomething(p1);
}
} else {
if (p2.isPresent()) {
result = myObject.calculateSomething(p2);
} else {
result = myObject.calculateSomething();
}
}
ดังนั้นคำถามของฉันคือ: ทำไมจึงถือว่าการปฏิบัติที่ไม่ดีที่จะใช้Optional
s เป็นข้อโต้แย้งวิธี (ดูวิธีแก้ไข 1) ดูเหมือนว่าจะเป็นวิธีที่อ่านได้ง่ายที่สุดสำหรับฉันและทำให้ชัดเจนที่สุดว่าพารามิเตอร์อาจว่างเปล่า / ไม่มีค่าสำหรับผู้ดูแลในอนาคต (ฉันทราบว่านักออกแบบที่Optional
ตั้งใจจะใช้เป็นประเภทส่งคืนเท่านั้น แต่ฉันไม่พบเหตุผลเชิงตรรกะใด ๆ ที่จะไม่ใช้ในสถานการณ์นี้)
null
หรือไม่