Không phải là một mẫu chống mỗi se, mà là một mẫu mã cho biết bạn cần cấu trúc lại.
Và nó khá dễ, bạn chỉ cần biết một quy tắc ngón tay cái không viết nhiều hơn một khối thử trong cùng một phương thức. Nếu bạn biết rõ để viết mã liên quan với nhau, thường chỉ là sao chép và dán từng khối thử với khối bắt của nó và dán nó bên trong một phương thức mới, sau đó thay thế khối ban đầu bằng lệnh gọi phương thức này.
Quy tắc này dựa trên đề xuất của Robert C. Martin từ cuốn sách 'Clean Code':
nếu từ khóa 'thử' tồn tại trong một hàm, thì đó sẽ là từ đầu tiên trong hàm và sẽ không có gì sau các khối bắt / cuối cùng.
Một ví dụ nhanh về "giả-java". Giả sử chúng ta có một cái gì đó như thế này:
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;
}
}
}
Sau đó, chúng tôi có thể cấu trúc lại mỗi lần thử bắt và trong trường hợp này, mỗi khối thử bắt thử cùng một thứ nhưng ở các vị trí khác nhau (tiện lợi như thế nào: D), chúng tôi chỉ phải sao chép dán một trong các khối thử bắt và thực hiện phương pháp của nó .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Bây giờ chúng tôi sử dụng điều này với cùng mục đích như trước đây.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Tôi hy vọng điều đó sẽ giúp :)