ไม่ใช่รูปแบบการต่อต้านต่อ se แต่เป็นรูปแบบรหัสที่บอกให้คุณต้องปรับโครงสร้าง
และมันค่อนข้างง่ายคุณต้องรู้จักกฎง่ายๆที่เขียนไม่เกินบล็อกลองในวิธีเดียวกัน หากคุณรู้จักการเขียนโค้ดที่เกี่ยวข้องเข้าด้วยกันโดยปกติจะเป็นการคัดลอกและวางแต่ละบล็อกลองด้วย catch catch และวางในวิธีการใหม่แล้วแทนที่บล็อกเดิมด้วยการเรียกใช้วิธีนี้
กฎข้อนี้ใช้ตามคำแนะนำของ Robert C. Martin จากหนังสือ 'Clean Code' ของหนังสือของเขา:
หากคำหลัก 'ลอง' มีอยู่ในฟังก์ชั่นควรเป็นคำแรกในฟังก์ชั่นและไม่ควรมีอะไรหลังจากที่ catch / สุดท้ายบล็อก
ตัวอย่างรวดเร็วเกี่ยวกับ "pseudo-java" สมมติว่าเรามีสิ่งนี้:
try {
FileInputStream is = new FileInputStream(PATH_ONE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_TWO);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
try {
FileInputStream is = new FileInputStream(PATH_THREE);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
}
จากนั้นเราสามารถ refactor แต่ละครั้งลอง catch และในกรณีนี้แต่ละ try-catch block พยายามสิ่งเดียวกัน แต่ในสถานที่ต่างกัน (ความสะดวก: D) เราเพียงคัดลอกวางหนึ่งในบล็อก try-catch และสร้างวิธีการ .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
ตอนนี้เราใช้สิ่งนี้โดยมีจุดประสงค์เช่นเดียวกับเมื่อก่อน
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
ฉันหวังว่าจะช่วย :)