それ自体はアンチパターンではなく、リファクタリングする必要があることを示すコードパターンです。
そして、それは非常に簡単です。同じメソッドでtryブロックだけを記述している経験則を知っている必要があります。関連するコードを一緒に書くことをよく知っている場合、通常は各tryブロックをcatchブロックでコピーして貼り付け、新しいメソッド内に貼り付けてから、元のブロックをこのメソッドの呼び出しで置き換えます。
この経験則は、彼の本「Clean Code」からの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ブロックの1つをコピーして貼り付け、そのメソッドを作成するだけです。 。
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;
}
}
私はそれが役立つことを願っています:)