本身不是反模式,而是告诉您需要重构的代码模式。
这很容易,您只需要知道一条经验法则即可以相同的方法编写try块。如果您知道如何一起编写相关代码,通常只需复制和粘贴每个try块及其catch块,然后将其粘贴到新方法中,然后用对该方法的调用替换原始块。
这个经验法则是基于罗伯特·C·马丁(Robert C. Martin)在他的《清洁代码》一书中的建议:
如果函数中存在关键字“ try”,则它应该是函数中的第一个单词,并且在catch / finally块之后应该没有任何内容。
关于“ 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;
}
}
}
然后我们可以重构每个try catch,在这种情况下,每个try-catch块都尝试相同的事情,但是在不同的位置(多么方便: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;
}
}
希望对您有所帮助:)