首页 > 解决方案 > 如何重构此代码以消除重复?

问题描述

为了 DRY(不要重复自己)代码,我想知道下面给出的代码是否可以以任何方式重构。在下面的代码中,如您所见,我重复了两个赋值语句,condition1因为condition2在每个 if 语句的末尾我进行了不同的函数调用。

websocket.onmessage = async(event) => {
    const data = JSON.parse(data)
    let infoFromExternalApi1, infoFromExternalApi2, infoFromExternalApi3

    // Assignments for infoFromExternalApi variables are repeated due to difference in function calls doSomething() and doSomethingElse()
    if (condition1) {
        infoFromExternalApi1 = await getInfoFromExternalApi1()
        infoFromExternalApi2 = await getInfoFromExternalApi2()
        infoFromExternalApi3 = await getInfoFromExternalApi3()

        doSomething()
    }

    if (condition2) {
        infoFromExternalApi1 = await getInfoFromExternalApi1()
        infoFromExternalApi2 = await getInfoFromExternalApi2()
        infoFromExternalApi3 = await getInfoFromExternalApi3()

        doSomethingElse()
    }
}

标签: javascriptrefactoring

解决方案


您可能正在寻找

websocket.onmessage = async(event) => {
    const data = JSON.parse(data)
    let infoFromExternalApi1, infoFromExternalApi2, infoFromExternalApi3

    if (condition1 || condition2) {
        infoFromExternalApi1 = await getInfoFromExternalApi1()
        infoFromExternalApi2 = await getInfoFromExternalApi2()
        infoFromExternalApi3 = await getInfoFromExternalApi3()
    }
    if (condition1) {
        doSomething()
    }
    if (condition2) {
        doSomethingElse()
    }
}

当然,如果两个条件都为真,即仅从外部 api 获取信息一次,这与您的原始代码的工作方式不同。


推荐阅读