Страницы

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

четверг, 9 января 2020 г.

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

#любой_язык #code_style


Я знаю, что сохранять переменную целесообразно, если она часто используется дальше:

int speed = car.getSpeed();
backgroundAnimator.setSpeed(speed);
speedometer.setSpeed(speed);


Но что, если переменная используется далее лишь один раз, но чтобы её получить надо
совершить долгий путь?

int speed = getScene().getCar().getBlahBlah...().getSpeed();
blah().blah.ichoblah().blaaaah(car, speed);


Не буду же я в таком случае объединять код ради того, чтобы избежать лишней переменной? 
    


Ответы

Ответ 1



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

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

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