首页 > 解决方案 > 无法重构方法中的代码?

问题描述

我有一个场景,我有四种方法包含所有相同的代码,除了 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;
            }

        }
    }

例外:将所有逻辑集中在一个地方

标签: java

解决方案


我认为这可以通过 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);
 }

推荐阅读