【问题标题】:Best way to design class for web service calls为 Web 服务调用设计类的最佳方式
【发布时间】:2014-03-05 16:04:43
【问题描述】:

我有大约 10 个 Web 服务调用,我创建了一个静态类,我将所有调用放在同一个类中

class WebserviceCalls {
  public static function getReportDetails($reportId) {}
  public static function getUserSession($userId) {}
  ....................................
}

然后我将拥有一个代理类WebServiceCallProxy,它在实际调用WebServiceCalls 类之前处理所有缓存。

通过这种设计,随着我的进展和需要新 Web 服务调用的新需求,我将简单地将新调用添加到 WebServiceCalls 类。

所有这些设计,随着它的发展,它对代码气味的调用,它违反了所有 OOP Solid 原则,类也没有凝聚力。我知道必须有更好的方法,可能是一些预定义的设计模式来处理此类问题,或者将每个方法分解为更简单的对象并将整个 WebServiceClass 视为不同的组件。

【问题讨论】:

    标签: php oop design-patterns solid-principles


    【解决方案1】:

    如果您使用的是 MVC 架构或类似的架构,最好将您的 WebServiveCalls 拆分并将方法放在模型层中。

    Report 类中放置一个getDetails() 函数,在User 类中放置一个getSession()

    在这些函数中,准备好检索必要数据所需的请求参数。然后在返回答案的WebService 类中调用request 函数。

    在你的方法中处理响应。

    如果您必须添加新调用,您可以轻松添加新模型或扩展现有模型。无需修改您的 WebService 类。

    【讨论】:

    • 有道理,但假设我已经拥有 User 模型并且我正在添加 getSession 哪个数据源(属性或参数)作为 Web 服务,而 User 模型中其他方法的数据源是数据库,你是怎么组织的?
    • 将您的WebService 和您的Database 作为服务处理。它们应该在您的应用程序生命周期中只存在一次。您可以使用单例模式来创建它们的实例。在您的User 模型getSession 调用WebService::getInstance()->request(params) 和数据库查询使用Database::getInstance()->query(query) 最好是某种ServiceManager 来获取服务实例。
    • MVC 中没有“模型”。模型是一层。请停止向人们建议您不了解的模式。此外,这对 OP 的问题没有任何帮助。而且,最重要的是:单例是一种反模式!!
    • 我不建议任何人使用单例。我建议使用ServiceManager。他可以选择最适合他需要的任何creational pattern。也许你可以给出你的解决方案作为答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2011-04-27
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多