Pas un anti-motif en soi, mais un motif de code qui indique que vous devez refactoriser.
Et c'est assez facile, il vous suffit de connaître une règle générale qui consiste à n'écrire qu'un bloc try de la même manière. Si vous savez bien écrire le code associé, il suffit généralement de copier et coller chaque bloc try avec ses blocs catch et de le coller dans une nouvelle méthode, puis de remplacer le bloc d'origine par un appel à cette méthode.
Cette règle empirique est basée sur la suggestion de Robert C. Martin de son livre "Clean Code":
si le mot clé 'try' existe dans une fonction, il doit s'agir du tout premier mot de la fonction et il ne doit y avoir rien après les blocs catch / finally.
Un exemple rapide sur "pseudo-java". Supposons que nous ayons quelque chose comme ceci:
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;
}
}
}
Ensuite, nous pourrions refactoriser chaque tentative d’attrape et dans ce cas, chaque bloc tentative-attrape essaiera la même chose mais à des endroits différents (quelle pratique: D), nous n’aurons qu’à copier-coller l’un des blocs tentative-attraper et à en faire une méthode .
public String loadConfigFile(String path) {
try {
FileInputStream is = new FileInputStream(path);
String configData = InputStreamUtils.readString(is);
return configData;
} catch (FileNotFoundException e) {
return null;
}
}
Nous l'utilisons maintenant dans le même but qu'avant.
String[] paths = new String[] {PATH_ONE, PATH_TWO, PATH_THREE};
String configData;
for(String path : paths) {
configData = loadConfigFile(path);
if (configData != null) {
break;
}
}
J'espère que ça aide :)