java - 无法重构方法中的代码?
问题描述
我有一个场景,我有四种方法包含所有相同的代码,除了 try 块中的一两行。任何人都可以建议如何重构它?
我尝试了 Enum 和 switch,但找不到正确的实现。问题是所有方法都有不同的返回类型。
public static void insertDocument(Test database, Test2 collectionName, Document docToInsert) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
addUniqueId(docToInsert);
database.getCollection(collectionName).insertOne(docToInsert);
return;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
public static FindIterable<Document> findDocument(MongoDatabase database, String collectionName, Document docToFind) {
int count = 0;
int maxTries = getMongoQueryRetries();
FindIterable<Document> document = null;
while (count < maxTries + 1) {
try {
return database.getCollection(collectionName).find(docToFind);
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
return document;
}
public static DeleteResult deleteDocument(MongoDatabase database, String collectionName, Document docToDelete) {
int count = 0;
int maxTries = getMongoQueryRetries();
DeleteResult deleteResult = null;
while (count < maxTries + 1) {
try {
deleteResult = database.getCollection(collectionName).deleteOne(docToDelete);
return deleteResult;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
return deleteResult;
}
public static void findAndReplaceDocument(MongoDatabase database, String collectionName, Document docToBeReplaced, Document newDocument) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
database.getCollection(collectionName).findOneAndReplace(docToBeReplaced, newDocument);
return;
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
例外:将所有逻辑集中在一个地方
解决方案
我认为这可以通过 a 来完成Callable
,例如:
public static <T> T processDbAction(Callable<T> dbAction) {
int count = 0;
int maxTries = getMongoQueryRetries();
while (count < maxTries + 1) {
try {
return dbAction.call();
} catch (MongoTimeoutException | MongoSocketReadTimeoutException | MongoSocketClosedException | MongoSocketReadException | MongoNotPrimaryException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (MongoSocketException | MongoServerException e) {
if (++count == maxTries) {
LOG.error(e.getMessage());
throw e;
}
} catch (Throwable e) {
LOG.error(e.getMessage());
throw e;
}
}
}
换句话说:你从这样一个辅助方法开始,它将所有常见的“框架”放在你的调用周围。然后你有不同的 Callable 接口实现,可以专注于他们的核心业务,而不用担心重试或异常处理/日志记录。
喜欢:
public FindAction implements Callable<Document> {
private final MongoDatabase database;
private final collectionName;
private final Document docToFind;
...
@Override
public Document call() throws Exception {
return database.getCollection(collectionName).find(docToFind);
}
推荐阅读
- google-app-engine - 使用 opencensus ext 时出现 Google App Engine 错误
- bash - 省略heredoc的注释
- python - 无法通过串口从 micro-python repl 挂载 sd 卡
- bash - 将填充零添加到名称文件
- haskell - 在大型 Pandoc 中有效地搜索单个元素
- reactjs - 前端-后端数据集成和获取的模式/方法
- c# - ASP.NET MVC 站点偶尔以随机 RESX 语言呈现 - 可能的 DI 问题?
- javascript - Puppeteer 刷新直到选择器值改变?
- python - Python Mysql 1.2.5 安装不起作用 Pycharm
- python - 加载并准备一个新数据集