Как я могу реорганизовать этот код, чтобы удалить дублирование?

#javascript #refactoring

#javascript #рефакторинг

Вопрос:

В интересах СУХОГО (не повторяйтесь) кода мне интересно, можно ли каким-либо образом реорганизовать приведенный ниже код. В приведенном ниже коде, как вы можете видеть, я повторяю инструкции для присваивания для обоих 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()
    }
}
  

Комментарии:

1. Как насчет использования оператора if только с doSomething amp; doSomethingElse ?

2. Где вы используете infoFromExternalApiN переменные? Можете ли вы опубликовать свой фактический код?

Ответ №1:

Вы, вероятно, ищете

 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 только один раз.