#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: Рад, что вам понравилось! 🙂