ฉันมักจะพบปัญหานี้โดยเฉพาะใน Java แม้ว่าฉันคิดว่ามันเป็นปัญหา OOP ทั่วไป นั่นคือการเพิ่มข้อยกเว้นพบปัญหาการออกแบบ
สมมติว่าฉันมีคลาสที่มีString name
ฟิลด์และString surname
ฟิลด์
จากนั้นจะใช้ฟิลด์เหล่านั้นเพื่อเขียนชื่อเต็มของบุคคลเพื่อแสดงในเอกสารบางประเภทพูดใบแจ้งหนี้
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
ตอนนี้ฉันต้องการเสริมสร้างพฤติกรรมของชั้นเรียนของฉันโดยการโยนข้อผิดพลาดถ้าdisplayCompleteNameOnInvoice
มีการเรียกก่อนที่ชื่อจะได้รับมอบหมาย ดูเหมือนจะเป็นความคิดที่ดีใช่ไหม?
ฉันสามารถเพิ่มรหัสยกข้อยกเว้นให้กับgetCompleteName
วิธีการ แต่ด้วยวิธีนี้ฉันละเมิดสัญญา 'โดยนัย' กับผู้ใช้คลาส ใน getters ทั่วไปไม่ควรโยนข้อยกเว้นหากไม่ได้ตั้งค่า ตกลงนี่ไม่ใช่ผู้ทะเยอทะยานมาตรฐานเพราะมันไม่ได้ส่งคืนเขตข้อมูลเดียว แต่จากมุมมองของผู้ใช้ความแตกต่างอาจบอบบางเกินไปที่จะคิดเกี่ยวกับมัน
หรือdisplayCompleteNameOnInvoice
ฉันจะโยนข้อยกเว้นจากภายใน แต่การที่จะทำเช่นนั้นฉันควรทดสอบโดยตรงname
หรือทุ่งนาและการทำเช่นนั้นผมจะละเมิดนามธรรมที่แสดงโดยsurname
getCompleteName
เป็นความรับผิดชอบของวิธีการนี้ในการตรวจสอบและสร้างชื่อทั้งหมด มันสามารถตัดสินใจได้โดยอาศัยการตัดสินใจกับข้อมูลอื่น ๆ ซึ่งในบางกรณีมันก็เพียงพอsurname
แล้ว
ดังนั้นความเป็นไปได้เท่านั้นดูเหมือนว่าจะเปลี่ยนความหมายของวิธีgetCompleteName
การcomposeCompleteName
ที่แสดงให้เห็นมากขึ้นพฤติกรรม 'ใช้งาน' และกับความสามารถของการขว้างปาข้อยกเว้น
นี่เป็นทางออกที่ดีกว่าหรือไม่ ฉันมักจะมองหาสมดุลที่ดีที่สุดระหว่างความเรียบง่ายและความถูกต้อง มีการอ้างอิงการออกแบบสำหรับปัญหานี้หรือไม่?
displayCompleteNameOnInvoice
จะสามารถส่งข้อยกเว้นได้ถ้าgetCompleteName
ส่งคืนnull
ใช่ไหม