No es un antipatrón per se, sino un patrón de código que le indica que necesita refactorizar.
Y es bastante fácil, solo tiene que conocer una regla general que no está escribiendo más que un bloque de prueba en el mismo método. Si sabe bien escribir código relacionado, generalmente solo está copiando y pegando cada bloque try con sus bloques catch y pegándolo dentro de un nuevo método, y luego reemplace el bloque original con una llamada a este método.
Esta regla general se basa en la sugerencia de Robert C. Martin de su libro 'Clean Code':
si la palabra clave 'try' existe en una función, debería ser la primera palabra en la función y que no debería haber nada después de los bloques catch / finally.
Un ejemplo rápido de "pseudo-java". Supongamos que tenemos algo como esto:
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;
}
}
}
Entonces podríamos refactorizar cada try try y, en este caso, cada bloque try-catch intenta lo mismo pero en diferentes ubicaciones (qué conveniente: D), solo tenemos que copiar y pegar uno de los bloques try-catch y hacer un método. .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Ahora usamos esto con el mismo propósito que antes.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
Espero que eso ayude :)