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