สมมติว่าเรามีวิธีการfoo(String bar)
ที่ทำงานบนสตริงที่ตรงกับเกณฑ์บางอย่างเท่านั้น [a-z0-9-_./@]+
ตัวอย่างเช่นมันจะต้องเป็นตัวพิมพ์เล็กต้องไม่ว่างเปล่าหรือมีเพียงช่องว่างและต้องตรงกับรูปแบบ เอกสารประกอบสำหรับวิธีการระบุเกณฑ์เหล่านี้
วิธีการที่ควรปฏิเสธการเบี่ยงเบนใด ๆ และทั้งหมดจากเกณฑ์นี้หรือวิธีการควรให้อภัยมากขึ้นเกี่ยวกับเกณฑ์บางอย่าง? ตัวอย่างเช่นถ้าวิธีการเริ่มต้นคือ
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
this.bar = bar;
}
และวิธีการให้อภัยครั้งที่สองคือ
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
bar = bar.toLowerCase().trim().replaceAll(" ", "_");
if (!bar.matches(BAR_PATTERN_STRING) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
}
this.bar = bar;
}
ควรเปลี่ยนเอกสารเป็นสถานะที่จะถูกแปลงและกำหนดเป็นค่าที่แปลงถ้าเป็นไปได้หรือควรใช้วิธีการที่ง่ายที่สุดและปฏิเสธความเบี่ยงเบนใด ๆ หรือทั้งหมด? ในกรณีนี้bar
ผู้ใช้แอปพลิเคชันสามารถตั้งค่าได้
กรณีการใช้งานหลักสำหรับกรณีนี้คือผู้ใช้ที่เข้าถึงวัตถุจากที่เก็บโดยตัวระบุสตริงที่ระบุ แต่ละอ็อบเจ็กต์ในที่เก็บควรมีสตริงที่ไม่ซ้ำกันเพื่อระบุ ที่เก็บเหล่านี้สามารถเก็บวัตถุได้หลายวิธี (sql server, json, xml, binary, ฯลฯ ) และดังนั้นฉันจึงพยายามระบุตัวหารร่วมที่ต่ำที่สุดที่จะตรงกับหลักการตั้งชื่อส่วนใหญ่
foo
ฟังก์ชั่นที่มีความเข้มงวดในสิ่งที่จะยอมรับข้อโต้แย้งและมีฟังก์ชั่นผู้ช่วยที่สองที่สามารถพยายามที่จะ "สะอาด" foo
ข้อโต้แย้งที่จะใช้กับ วิธีนี้แต่ละวิธีมีน้อยกว่าที่ต้องทำด้วยตัวเองและพวกเขาสามารถจัดการและบูรณาการได้อย่างหมดจดมากขึ้น หากลงไปตามเส้นทางนั้นมันอาจจะเป็นประโยชน์ถ้าคุณย้ายออกจากการออกแบบที่มีข้อยกเว้นมาก คุณสามารถใช้สิ่งที่ชอบOptional
แทนแล้วมีฟังก์ชั่นที่ใช้foo
ข้อยกเว้นการโยนหากจำเป็น