使用异步调用解开嵌套if / else结构的模式

时间:2014-07-11 12:10:57

标签: java android oop design-patterns asynchronous

我必须计算出一个结果,这个结果取决于从异步调用中获得的许多模型。这些异步调用执行网络调用或UI中断(提示用户要求他/她选择某些内容)。

我的第一次尝试只是以递归方式调用一个丑陋的if / else嵌套,看起来像这样:

public void getResult() {
    if(mModelA == null) {
        getModelA();
    } else if(mModelB == null) {
        getModelB(mModelA.someData);
    } else if(mModelB.value == -1) {
        askUserAboutValue();
    } else if(mModelB.value == 5) {
        getModelC();
    } else if(mModelB.value == 3) {
        getModelD();
    } else if(...) {
        ....
    }
}

方法getModelX和askUserAboutValue执行异步任务,当它们完成时,它们会编写一些全局变量并在其回调中调用getResult()。

我想知道是否有一种模式可以简化这种意大利面条代码,更重要的是简单地进行单元测试。

我认为在更简单的方法中隔离每个检查(例如:checkModelA())可能有所帮助,但它可能存在更好的东西。

顺便说一句,这是在Android应用程序的Activity中执行的,所以我只能将所有这些代码只包含在一个类中。

2 个答案:

答案 0 :(得分:0)

也许一个开关会更好用吗?或者只使用一个自定义方法,该方法接受mModelB.value返回的Integer?注意“Integer”而不是int来检查该null。

另一个建议是使用多态,也许创建一个名为“getModel(mModelB.value)”的方法。

答案 1 :(得分:0)

Switch Case / If-Else问题通常可以解决设计不良的问题。

看起来你应该对你的ModelB进行SubClass,使得5,-1和3的值是不同的ChildClass,它们都与作为ModelB的父类有关。

但是从每个If子句中调用的函数来看,似乎-1不是SubClass而是错误。感觉就像在单个函数中,您尝试识别应该使用的正确类并管理1个错误情况。应该在名为。

的函数内处理错误情况

所以在简历中,这是一团糟吗?我很乐意帮助你,但你必须给我更多关于这些"价值"那些"模型"以及它们如何相互作用或相互作用,以便我可以尝试提出更好的设计。你的问题不只是在这个If / Else函数上,而是更大。