Добавить результат одной и той же функции к нескольким переменным без временной переменной

#javascript #refactoring

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

Вопрос:

Это то, что у меня есть:

 let num1 = 0;
let num2 = 5;

num1  = longFunction();
num2  = longFunction();
  

Я знаю, что могу это сделать:

 let num1 = 0;
let num2 = 5;

let _ = longFunction();
num1  = _;
num2  = _;
  

Но это добавляет временную переменную, которая, как мне кажется, должна быть запахом кода. Я никогда не собираюсь использовать _ мимо этих двух строк.

Есть ли способ сделать это без использования временной переменной и при вызове функции только один раз?

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

1. С каких пор использование переменной «пахнет кодом»?

2. что не так с одной переменной? все другие возможности кэширования требуют большего, чем примитивное значение

3. Это не запах кода, но кажется, что так и должно быть. Если я работаю над функцией с четырьмя или пятью временными переменными, мне это кажется загроможденным. Кажется, распространенным мнением является то, что наличие временных переменных — это чистый способ сделать это, поэтому я буду продолжать использовать временные переменные.

4. «Если я работаю над функцией с четырьмя или пятью временными переменными» , ваши функции слишком велики. Разбейте их. Заставьте их делать что-то одно, но делать это хорошо. И в качестве бонуса, их будет намного проще тестировать (если вы проводите модульное тестирование)

5. @blex, это хороший совет, спасибо. Я работаю с чужим кодом, поэтому я пытался повторно использовать столько, сколько смогу. Но вы правы, я собираюсь упростить то, над чем я работаю, в меньшие, менее сложные функции. Спасибо.

Ответ №1:

Если вы хотите избежать переменной, вот одно из решений:

 let num1 = 0;
let num2 = 5;

[ , num1, num2] = [longFunction(), num1, num2].map(
  (n, i, arr) => n   arr[0]
)

console.log(num1, num2);


function longFunction() { return 5 }  

Это запах кода.


Вот еще «лучший» вариант.

 let num1 = 0;
let num2 = 5;

num2 = (num2 - num1)   (num1  = longFunction())

console.log(num1, num2);


function longFunction() { return 5 }  

При присвоении num2 он предварительно вычитает num1 из num2 , но затем добавляет к этому сумму (присвоение) longFunction to num1 , что эквивалентно простому добавлению longFunction() к num2 .

Было интересно писать, но, конечно, не делайте этого.

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

1. Умно, но да, «Это запах кода». . Никогда не жертвуйте удобочитаемостью из-за чего-то такого простого, как создание временной переменной

2. Не думал, что буду смеяться, публикуя это, спасибо!

3. @blex: Да, это было какое-то саркастическое кодирование. Я добавил еще один.

4. @BigBadBenny: Рад, что вам понравилось! 🙂