【问题标题】:Javascript (Node.js) - Refactoring a long functionJavascript (Node.js) - 重构一个长函数
【发布时间】:2021-02-22 11:25:01
【问题描述】:

我有一个函数,它与特定概念“通知”相关联。

创建模块“Notifications.js”后,我编写了以下内容:

function Notifications() {} // No constructor...

Notifications.sendPushNotification = async function (
  title,
  body,
  data,
  badge = undefined,
  sound = "default",
  pushNotificationsTokens
) {
    // Part 1 - 6 lines

    // Part 2 - 10 lines
    
    // Part 3 - 20 lines
}

module.exports(Notifications);

然后,我也想过通过这样做来使代码更好:

Notifications.sendPushNotification = async function (
  title,
  body,
  data,
  badge = undefined,
  sound = "default",
  pushNotificationsTokens
) {
    part1();
    part2();
    part3();

    function part1() {
       // 6 lines
    }

    function part2() {
       // 10 lines
    }
    
    function part3() {
       // 20 lines
    }
}

module.exports(Notifications);

这里,我想到了另一个问题:

即使它们只有静态方法,在独立模块中创建类是否也是一种代码风格? 我见过一些 GitHub 存储库,不同的开发人员在其中执行此操作。但为什么?这种方式是否与 DDD 之类的编程方法相关联?做上面的代码和这段代码有区别吗?

notifications.js

exports.sendPushNotification = async function (
  title,
  body,
  data,
  badge = undefined,
  sound = "default",
  pushNotificationsTokens
) {
    part1();
    part2();
    part3();

    function part1() {
       // 6 lines
    }

    function part2() {
       // 10 lines
    }
    
    function part3() {
       // 20 lines
    }
}

另外,有没有更好的方法来重构这个函数?例如,一些专业的方法来传递长长的参数列表,使用较短的名称,或类似的东西。

【问题讨论】:

  • 这个问题是软件工程的定义。笼统地说是不可能的,因为它总是取决于具体情况。一个长函数或一个有很多参数的函数表明它可能做的太多了。你是否想对它做点什么取决于它有多复杂,它有多重要,你有多少时间等等。
  • 那么定义一个没有构造函数的类,它只有一个静态方法,而不是仅仅导出一个函数呢?
  • 静态类方法和函数是等价的。这样做可能有遗留(或未来)的原因。也许有(或将会有)相关的功能,将它们放在一个类中可能会很好。这也有点个人口味了。

标签: javascript node.js module coding-style refactoring


【解决方案1】:

是的,保持代码重构是一种很好的做法。我经常使用 async 模块来处理我的异步函数。您可以在https://caolan.github.io/async/v3/ 找到该模块。如果这些函数不是异步的并且您的函数依赖于变量。您应该使用以下策略进行重构。这只是我遵循的一个建议。

exports.sendPushNotification = async function (
  title,
  body,
  data,
  badge = undefined,
  sound = "default",
  pushNotificationsTokens
) {
    let var1 = part1(title);
    let var2 = part2(body, var1);
    let var3 = part3(var1, var2);
    
    // ...do some calculations
}


function part1(title) {
   // 6 lines
}

function part2(body, param1) {
   // 10 lines
}

function part3(param1, param2) {
   // 20 lines
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多