Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Хорошо ли сохранять промежуточное значение в переменную, если строчка уже длинная?

Я знаю, что сохранять переменную целесообразно, если она часто используется дальше:
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(). Создание функции-геттера получится применить и в рассматриваемой ситуации. Можно этот длинный вызов обернуть в другой вызываемый объект (функцию, лямбду) с коротким именем, чтобы он возвращал требуемое значение. Такое применимо, если запрашиваемое значение может изменяться, пока Ваш код работает, а запрашиваемое значение обновляется (например, в другом потоке). С переменной придется обновлять значение, заново вызывая эти спагетти.

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

Отправить комментарий