拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何使用Java中的“任务”重构此代码?

如何使用Java中的“任务”重构此代码?

白鹭 - 2022-03-15 1938 0 0

问题是关于此代码(在 Android 应用程序中):

private Task<QuerySnapshot> getVotesFromDB() {
    res = new int[]{0, 0, 0};   // a private class-member
    return FirebaseFirestore.getInstance().collection("Votes")
            .whereEqualTo("proposition_key", curr_proposition.getKey())
            .get().addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        String userChoice = (String) document.get("user_choice");
                        int choice;
                        switch (userChoice) {
                            case "against":
                                choice = 0;
                                break;
                            case "impossible":
                                choice = 1;
                                break;
                            case "agreement":
                                choice = 2;
                                break;
                            default:
                                throw new IllegalStateException("Unexpected value: "   userChoice);
                        }
                        res[choice]  ;
                    }
                }
            });
}

通常,代码从 Firestore 集合中读取一些行,并对它们应用一些“业务逻辑”(计算每种型别的字符串数)。将来,业务逻辑可能会变得比计数复杂得多。所以我正在寻找一种重构代码的方法,这样业务逻辑就可以与数据库分开撰写和测验。我想要的是具有以下形式的功能:

int[] countVotes(Generator<String> strings) {
     res = new int[3];
     (for String userChoice: strings)  {
          // Update res as above
     }
     return res;
}

无需任何数据库连接即可进行单元测验。那么,上面的函式可以重构如下:

private Generator<String> getVotesFromDB() {
    return FirebaseFirestore.getInstance().collection("Votes")
            .whereEqualTo("proposition_key", curr_proposition.getKey())
            .get().addOnCompleteListener(task -> {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        userChoice = (String) document.get("user_choice");
                        yield userChoice;
                    }
                }
            });
}

并运行类似的东西:

countVotes(getVotesFromDB())

问题是,我不知道如何使用异步函式呼叫来做到这一点。有没有办法以类似或更好的方式重构代码?

uj5u.com热心网友回复:

您可以将结果收集到一个阵列中,然后使用单独的方法对其进行处理。然后,如果处理方法很复杂,则可以针对各种不同的结果串列单独进行单元测验。

private void getVotesFromDB() {
    FirebaseFirestore.getInstance().collection("Votes")
        .whereEqualTo("proposition_key", curr_proposition.getKey())
        .get().addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                ArrayList<String> results = new ArrayList();
                for (QueryDocumentSnapshot document : task.getResult()) {
                    String userChoice = (String) document.get("user_choice");
                    results.add(userChoice);
                }

                // assign the result to a class member
                res = countVotes(results);

                // do something to signal to the rest of the code
                // that results have been processed (e.g. post to
                // LiveData or call another "showResults" method)
            }
        });
}

然后,任何复杂的计数逻辑都可以与 firebase 呼叫分开。

int[] countVotes(ArrayList<String> choices) {
    int[] res = new int[]{0,0,0}; 

    // count the votes

    return res;
}
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *