Я знаю, что сохранять переменную целесообразно, если она часто используется дальше:
int speed = car.getSpeed();
backgroundAnimator.setSpeed(speed);
speedometer.setSpeed(speed);
Но что, если переменная используется далее лишь один раз, но чтобы её получить надо совершить долгий путь?
int speed = getScene().getCar().getBlahBlah...().getSpeed();
blah().blah.ichoblah().blaaaah(car, speed);
Не буду же я в таком случае объединять код ради того, чтобы избежать лишней переменной?
Ответ
Если говорить о стиле и поддержке кода, то использование переменной (т.е. создание ячейки памяти и вынос этого длинного инициализирующего выражение в отдельную строку) повышает читабельность и понимаемость кода, а также, в случае апдейта конкретного фрагмента кода эта переменная может быть использована повторно (если только Вы не можете гарантировать, что такого точно не будет).
Можно это длинное выражение вставить в функцию в некоторых случаях, например, когда функция принимает rvalue. Или Вам надо сэкономить на создании переменной, хотя это не сильно отразится на всей картине.
Вот что говорится об использовании такой переменной:
Каждая переменная должна объявляться в самом глубоком блоке, который окружает все возможные места использования переменной.
Также можете обратить внимание на эту статью, в частности, правила 61 и 64. Обращаю внимание, что эти правила относятся к булевым переменным, но идеология та же:
bool isFinished = (elementNo < 0) || (elementNo > maxElement);
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry)
{
...
}
// NOT:
if ((elementNo < 0) || (elementNo > maxElement)||
elementNo == lastElement)
{
...
}
Задание булевых переменных для выражений приведёт к самодокументированию программы. Конструкцию будет легче читать, отлаживать и поддерживать.
File* fileHandle = open(fileName, "w");
if (!fileHandle)
{
...
}
// NOT:
if (!(fileHandle = open(fileName, "w")))
{
...
}
Исполняемые выражения в условиях усложняют читаемость. Особенно это касается новичков в С/С++.
Примечание: Не помню, какой автор писал об этом (полагаю, многие), но есть рекомендация заменять глобальные переменные функциями типа get(). Создание функции-геттера получится применить и в рассматриваемой ситуации. Можно этот длинный вызов обернуть в другой вызываемый объект (функцию, лямбду) с коротким именем, чтобы он возвращал требуемое значение. Такое применимо, если запрашиваемое значение может изменяться, пока Ваш код работает, а запрашиваемое значение обновляется (например, в другом потоке). С переменной придется обновлять значение, заново вызывая эти спагетти.
Комментариев нет:
Отправить комментарий