首页 > 解决方案 > 在 NodeJS / Express 中定义相同功能的 2 个可切换实现

问题描述

我有一堆字段要计算,我有 3 个案例。

字段大多相同,但存在一些差异。

此外,获取每个字段的计算可能取决于不同的变量,因此函数可能具有不同的签名。

在其他语言中,我会定义一个接口,使用使用接口而不是具体类的构造函数并使用依赖注入。

在nodeJS中,我是一个新手,我看到没有接口这样的东西。

举一个具体的例子,我必须计算

我有2个案例:

现在,我添加一个参数:

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(...)

标签: node.jsinterface

解决方案


对于不同的情况,您可以使用不同的功能,如下所示:

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 情况不需要或使用billedCSFCoefor 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();
  }
}

推荐阅读