通用代码生成与硬编码 API 调用:最佳方法

Generic code generation vs Hardcoded API calls: Best approach

我被困在一个场景中,想知道可以应用的最佳实践。我在处理订单、发货、发票等的电子商务网站上工作。

除了在我的应用程序中创建 UI,我还能够 send/receive 来自不同供应商的数据(通过供应商 apis xml/json)。该应用程序可以 post orders/shipments 到在我的应用程序中创建的供应商,或者从供应商处获取所有 orders/shipments 以导入我的应用程序。情况因供应商而异。

我的问题是处理此问题的最佳方法是什么。以下是我想到的两种方法。我现在正在使用第一种方法,但我在考虑在这种情况下是否适合使用它。

1.) 我创建了一个通用代码以基于 XPATH 生成 JSON/XML。例如,对于下面的 XML 代,我使用 XPATH 作为 Orders.order.orderNumber <Orders><order><orderNumber>testorder</orderNumber></order></Orders> XPATH存储在数据库中,根据数据库中配置的不同XPATH,生成完整的JSON/XML发送给供应商(GET/POST也在数据库中配置)

我认为这种方法的优点是将新供应商添加到系统中的工作最少。 我认为它的缺点是 XML/JSON 一代经历了大循环。由于要为供应商调用的 API(Orders GET 等)大部分是固定的,这似乎是一个缺点。

2.) 我创建单独的服务来处理每个供应商调用,创建处理每个调用的方法 XML 硬编码到应用程序中(无需通过 XPATH 在数据库中进行配置)。 例如,对于 2 个供应商 SuppA 和 SuppB。对于 SuppA,将下载订单列表,对于 SuppB,将 post 编辑发货。 因此,我的应用程序中将有 2 个服务处理每个供应商的调用,每个供应商相互独立,1 个用于 SuppA,另一个用于 SuppB。 SuppA 服务将调用订单 GET api,SuppB 服务将调用 Shipments POST api.

我认为这样做的优点是它会很快,因为不需要生成 XML/JSON,因为每个供应商的服务代码中只会编码所需的调用。 我认为它的缺点是只能调用固定服务。我的第一种方法可以通过数据库更改任何内容,但在此代码中需要更改。

请对此提出建议。哪种方法最适合这种情况,通用数据库配置还是硬编码的独立供应商服务?

首先为代码编写单元测试。这很可能会导致您问自己是什么导致了更可测试和可维护的应用程序以及什么以最优质的方式解决了问题。答案可能是#1 和#2 的组合。硬编码 "magic" 值从来都不是一个好的选择。而且,在性能 and/or 可伸缩性方面,不得不调用一个沉重的持久层也不是很好。

我建议:

  1. 将值存储在易于维护的可配置位置。
  2. 使用像 Redis 或 Memcache 这样的缓存层来允许代码以可伸缩和可扩展的方式获取值。

好处:

  1. 防止硬编码。
  2. 防止应用程序配置更改resets/restarts。
  3. adding/removing 新供应商的更多可扩展代码。
  4. 更好的整体应用敏捷性。

最后注意:作为一个有趣的想法,您可以使用工厂模式动态生成供应商对象,以允许向 运行 系统添加和删除供应商 w/out重新编码系统。这有点复杂,但可能是一种选择。

我个人认为第二种方法更接近我选择的解决方案:您有许多必须与之通信的外部接口。根据你的描述,我了解到,所有处理 XML 或 JSON。想到这么快要加新供应商的情况,就变成了可维护性的问题。

所以我会为每个供应商定义一个具有匹配数据模型的接口。在你这边,你将有一个不同的数据模型来表示订单、发货、发票等等。然后,您可以使用 Dozer 之类的映射框架将数据从一种表示形式转换为另一种表示形式。

然后您可以使用不同的框架 JAXB or GSON 将您的对象转换为 XML 或 JSON。