我的应用程序接收来自humain客户端的http请求。
我的应用程序只需要调用其他12个API中的一个API,这取决于它接收到的输入中的一个特定数据。
我的第一个想法当然是
// requestPrice.js
const service = req.body.service
const APIs = {
ser1: callAPI1,
ser2: callAPI2,
ser3: callAPI3,
// ...
ser12: callAPI12,
}
return APIs[service](req.body)这可以很好地工作,但我想需要一些重构来使其完全兼容。通常,在OOP中,我会选择一种设计模式,比如策略或责任链。
然而,我使用的是函数式编程,所以有点不同。
我想做以下几件事:
// 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。
这样做是否符合可靠的原则,还是有更好、更干净的方法?
发布于 2021-08-22 15:20:14
我建议使用工厂方法(在FP中作为curried函数实现),这样就可以分开决定调用哪个服务以及在每个服务中做什么。应将request.body传递给返回的impl函数。
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,因此维护了依赖反转。较高级别的模块不知道较低级别的模块。:)
https://stackoverflow.com/questions/68880449
复制相似问题