【问题标题】:JS Avoid same if statement in multiple locationsJS 避免在多个位置使用相同的 if 语句
【发布时间】:2021-10-06 13:53:48
【问题描述】:

我有一个function,它处理大量 JSON 文档,inserts 将它们处理成MongoDB

我想log 这个函数在几个位置做什么,然后将有效负载转移到 S3。但是,这是被调用者的条件。

function doStuffWithJSON(options={}) {
    const apiRes = getJSONFromAPI();

    if (options.logAndChuck) { console.log('we got results successfully') }

    //50 lines of code that are unconditionally being executed

    if (options.logAndChuck) { console.log('we did stuff with the result') }

    //Another 50 lines of code that are unconditionally being executed

    if (options.logAndChuck) { sendJsonToS3(apiRes) }
}

这里的重复模式是我在函数的多个不同位置有相同的if 语句。考虑到它的性质,不确定是否有任何方法可以避免这种情况。

想知道是否有任何模式可以像这样清理东西。

谢谢!

【问题讨论】:

  • 您可以为此创建一个函数 - 在本地函数范围或更高的范围内采用回调函数。
  • 嗯,你在做不同的事情,所以这不是一回事......你可以创建一个日志方法来进行检查。
  • 好吧,我以更一般的方式阅读了这个问题(“想知道是否有任何模式可以像这样清理东西”)。是的,有一个模式。然而,对于这个简单的if 语句,多次使用它不是问题,但它可能会更复杂。更像是doStuff(options, () => ...)
  • 有什么更复杂的例子以及对实际模式的参考吗?谢谢
  • @user2402616 请参阅下面的答案。 “更复杂”是指if (options.optionA && !options.optionB && options.optionC != 'something') ...

标签: javascript node.js design-patterns


【解决方案1】:

这真的取决于 - 恕我直言,多次使用简单的 if 语句不是问题。但是,如果它更复杂,您可以为此创建一个函数 - 在本地函数范围内或以上采用回调函数:

function doStuffWithJSON(options={}) {
    const exec = (callbackFn) => {
        if (options.logAndChuck) {
            callbackFn();
        }
    };

    const apiRes = getJSONFromAPI();

    exec(() => console.log('we got results successfully'));

    //50 lines of code that are unconditionally being executed

    exec(() => console.log('we did stuff with the result'));

    //Another 50 lines of code that are unconditionally being executed

    exec(() => sendJsonToS3(apiRes));
}

【讨论】:

  • 谢谢!对我为上述答案发布的评论有何见解?
  • 我看不出有什么缺点,只要你只想使用doStuffWithJSON(...)中的函数。如果您想在其他地方使用它,则必须将其提升到另一个范围,例如类。
  • 你知道内存影响是什么吗?每次调用doStuffWithJson 时,Node 会初始化exec fn 吗?即便如此,还够担心吗?
  • 您不必担心内存占用。内部函数不会比任何其他函数占用更多内存 - 闭包是一种通用语言结构,并由编译器和引擎进行了很好的优化。每次您输入函数时,都会创建一个 exec 函数的新实例 - 从性能和内存的角度来看,这可以与对象创建进行比较。
【解决方案2】:

将问题的 cmets 中的建议放入代码中:

function doStuffWithJSON(options={}) {
    const apiRes = getJSONFromAPI();

    logAndChuck('we got results successfully')

    //50 lines of code that are unconditionally being executed

    logAndChuck('we did stuff with the result')

    //Another 50 lines of code that are unconditionally being executed

    if (options.logAndChuck) { sendJsonToS3(apiRes) }
}

function logAndChuck(options, message) {
    if (options.logAndChuck) { console.log(message) }
}

【讨论】:

  • logAndChuck 放在doStuffWithJson 的本地函数范围内有什么好处? (正如@majusebetter 所建议的那样)?我想知道其他不会使用 logAndChuck 的被调用者 - 并且,因此将其添加到 doStuffWithJson 中可能会很浪费。 logAndChuck 很少被调用
  • 如果你想在其他函数中重用它,你必须在函数之外定义它。如果你只在那个函数中需要它,你可以在里面定义它,但你不必这样做。如果未导出,该函数仍将作用于模块。我不确定 V8 是否足够聪明以优化内部函数的定义,以便在不需要时每次调用外部函数时都不会不断地重新定义它们。但即使不是,将它放在外面也可能会带来很小的性能提升。
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 2020-01-28
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多