node.js - 在 NodeJS / Express 中定义相同功能的 2 个可切换实现
问题描述
我有一堆字段要计算,我有 3 个案例。
字段大多相同,但存在一些差异。
此外,获取每个字段的计算可能取决于不同的变量,因此函数可能具有不同的签名。
在其他语言中,我会定义一个接口,使用使用接口而不是具体类的构造函数并使用依赖注入。
在nodeJS中,我是一个新手,我看到没有接口这样的东西。
举一个具体的例子,我必须计算
我有2个案例:
案子
sup36 === true
fixedRouting = (CG + CC + CSF * subscribedPower) / 12
案子
sup36 === false
fixedRouting = (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100
现在,我添加一个参数:
getFixedRouting(isSup36, CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
if isSup{
return (CG + CC + CSF * subscribedPower) / 12
}else{
return (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100
}
},
问题是我将有超过 2 个案例,将来我将不得不编写更多案例。这种编码方式也会增加我的代码的复杂度。
我应该怎么做才能拥有 2 个可切换的实现getFixedRouting(...)
?
解决方案
对于不同的情况,您可以使用不同的功能,如下所示:
function getFixedRoutingSup36(CG, CC, subscribedPower) {
return (CG + CC + CSF * subscribedPower) / 12;
}
function getFixedRoutingNonSup36(CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
return (CG + CC) / 12 + subscribedPower * billedCSFCoef * numDayInPeriod / 100;
}
如果发送给每个参数的参数差异很大(例如上面的 sup36 情况不需要或使用billedCSFCoef
or numDayInPeriod
),这将很有帮助。
如果您喜欢为所有这些设置一个入口点,您仍然可以像这样拆分上面的功能,但拥有一个告诉人们使用的入口点:
function getFixedRouting(dataType, CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod) {
switch (dataType) {
case 1:
return getFixedRoutingSup36(CG, CC, subscribedPower);
case 2:
return getFixedRoutingNonSup36(CG, CC, subscribedPower, billedCSFCoef, numDayInPeriod);
case 3:
return someOtherFunction();
}
}
这里的缺点是,如果您的各种情况采用不同的参数集,它可能会变得丑陋。
另一种变体是将参数作为 Javascript 对象传递,因此内容可以有所不同:
function getFixedRouting(data) {
switch (data.type) {
case 1:
return getFixedRoutingSup36(data.CG, data.CC, data.subscribedPower);
case 2:
return getFixedRoutingNonSup36(data.CG, data.CC, data.subscribedPower, data.billedCSFCoef, data.numDayInPeriod);
case 3:
return someOtherFunction();
}
}
推荐阅读
- angular6 - Angular 反应式 FormGroup 未在第三方控件中重置
- php - 使用命名空间解析 XML 响应
- excel - 移动负号
- javascript - nodeJS 在同一文件夹中找不到模块
- sql-server - Dynamics 365 On Premise 中的 SQL Server 视图
- django - 序列化器等价于 rest 框架中的 django 表单的 clean 序列化器
- angular - 如何在 Angular 中导航(重定向)到我想要的任何页面?
- html - 用于在移动设备中心定位徽标的 CSS 媒体查询
- python-3.x - flask_script 问题 python 3.4
- vue.js - Vue.js:Leaflet-Marker 不可见