好还是坏 - 使用构造函数从远程Web服务初始化模型

7

我想知道通过向Web服务发出请求初始化模型是好还是坏,或者使用构造函数之后调用的另一个公共方法更好。

例如:

class Model {
    ModelData data;

    Model(Integer model_id) {
       data = Request.getDataFromWebServices(model_id);
    }
}
6个回答

5
通常,使用作为构造函数参数的必需参数是一种很好的方法,以使类能够正常工作(而不是使用设置器)。因此,在您的情况下,如果model_id对于Model的工作是必需的,那么您将其放在那里是正确的。现在,您使用model_id进行远程方法调用。远程方法调用可能需要更长时间才能执行,这使得Model初始化所需的时间更长,并且可能由于网络原因而失败。如果API涵盖了来自网络层或实际处理的任何异常并返回一个良好的值以初始化Model,则在我看来应该是可以的。只需记录该类由于网络访问而需要更长时间进行初始化即可。

4
问题不在于在构造函数或其他任何地方使用,而在于使用全局变量。更好的方法是通过实例将request传递以显示模型API中的依赖关系:
class Model {
  final ModelData data;

  Model(Request request, int model_id) {
    data = request.getDataFromWebServices(model_id);
  }
}

或者通过一个更具描述性的工厂方法创建:
class Model {
  static Model createModelFromWebServices(Request request, int model_id) {
    return new Model(request.getDataFromWebServices(model_id));
  }

  final ModelData data;

  Model(ModelData data) {
    this.data = data;
  }
}

我使用了原始的int而不是Integer,因为我想表明null不是model_id的有效值。


+1 因为我没有考虑“请求”问题。但是通过使用 ModelRequest,扩展 Model 总是可能的,不是吗? - sahid

1

看起来这高度依赖于您的个人情况。

我个人可能会将构造函数设为私有,并公开一个名为“CreateModelFromService”的公共静态方法,以便向使用我的类的任何其他人明确表明由于网络连接等原因,该方法可能会失败的机会比正常情况更大。当实例化一个看似与网络无关的类时,我通常不会预期出现这样的错误。

仅代表个人意见。


0
假设您想对某个需要您的模型类实例的单元进行测试。那么,如果没有 Web 服务,您该如何创建此实例呢?
或许值得考虑使用 工厂 来代替特定的组装机制来创建模型实例。这样可以将模型与组装机制分离开来。
class Model {
    Model(ModelData data) { ... }
}

class ModelFactory {
    private Request request;

    Model create(Integer modelId) { 
        return new Model(request.getDataFromWebServices(modelId));
    }    
}

-1 工厂模式不是解决这个问题的合适模式。 - sahid

0

这取决于组件将在何处使用。大多数程序员希望构造函数能够快速完成,因此进行网络操作可能不是最佳选择。


0

在实例化时和稍后初始化都是有效的。真正的问题是你正在处理什么限制,什么可能会在某些时候失败,何时需要访问状态以及是否能够处理等待直到需要访问状态来计算状态的潜在延迟。除非你的情况需要另一种方法,否则两者都没有对错之分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接