ฉันมักจะพบปัญหานี้โดยเฉพาะใน 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ใช่ไหม