java - 无法重构方法中的代码?

标签 java

我有一个场景,其中有四种方法包含所有相同的代码,除了 try block 中的一两行之外。有人可以建议如何重构它吗?

我尝试了 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;
            }

        }
    }

异常(exception):将所有逻辑集中在一处

最佳答案

我认为这可以通过 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 接口(interface)的不同实现,这些实现可以专注于其核心业务,而无需担心重试或异常处理/日志记录。

喜欢:

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);
 }

关于java - 无法重构方法中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57252122/

相关文章:

java - 带撇号的单词的正则表达式 (Java)

java - ResponseAdvice 未触发

java - 如何在java cmd进程中按顺序执行多个命令

java - 在ArrayLists中调用accountNo,accountName

java - Memozied Fibonacci 不运行与常规 Fibonacci 解决方案

java - Wildfly - 允许在没有证书的情况下连接到 SSL 站点

java - 如何使用 Java 中的 POI 在不同列上写入现有的 Excel (*.xlsx) 文件?

java - 如何检测tomcat连接池问题

java - Stackdriver Logback 附加程序停止应用程序

java - 如何在不使用迭代器或集合的情况下迭代 Map?