首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在函数式编程范式中动态调用API

如何在函数式编程范式中动态调用API
EN

Stack Overflow用户
提问于 2021-08-22 10:29:24
回答 1查看 156关注 0票数 0

我的应用程序接收来自humain客户端的http请求。

我的应用程序只需要调用其他12个API中的一个API,这取决于它接收到的输入中的一个特定数据。

我的第一个想法当然是

代码语言:javascript
复制
// requestPrice.js

const service = req.body.service

const APIs = {
    ser1: callAPI1,
    ser2: callAPI2,
    ser3: callAPI3,
    // ...
    ser12: callAPI12,
}

return APIs[service](req.body)

这可以很好地工作,但我想需要一些重构来使其完全兼容。通常,在OOP中,我会选择一种设计模式,比如策略或责任链。

然而,我使用的是函数式编程,所以有点不同。

我想做以下几件事:

代码语言:javascript
复制
// ser1.js
export default callAPI(data) {
    // code 1
}

// ser2.js
export default callAPI(data) {
    // code 2
}

// ser3.js
export default callAPI(data) {
    // code 3
}

//...

// ser12.js
export default callAPI(data) {
    // code 12
}

// requestPrice.js
const service = req.body.service
const api = require(`./${service}`)

return api(req.body)

这看起来比第一个版本要好得多,因为它更好地遵循了单一责任原则。另外,我猜它也遵循开放/封闭的原则,因为如果要添加第13个requestPrice.js,它不会改变。另一方面,我应该能够很容易地对文件requestPrice.js进行单元测试,因为可以注入req

这样做是否符合可靠的原则,还是有更好、更干净的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-22 15:20:14

我建议使用工厂方法(在FP中作为curried函数实现),这样就可以分开决定调用哪个服务以及在每个服务中做什么。应将request.body传递给返回的impl函数。

代码语言:javascript
复制
function createService(body) {
  if(checkInput(body) == [something]) return service1;
  else if(checkInput(body) == [something2]) return service2;
  ..
}

function service1(body) {..}
function service2(body) {..}
..

let service = createService(req.body);
service(request.body);

我没有把它放在不同的文件中,但你可以这样做。现在,createService可以位于不同的模块中。并且每个impl (service1、service2等)可以在它们自己的单独文件中,并且服务的调用者不需要知道要调用哪个impl,因此维护了依赖反转。较高级别的模块不知道较低级别的模块。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68880449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档