Производительность
Производительность - один из наименее интересных вопросов для этого вопроса, и я говорю это как человек, работающий в очень критичных для производительности областях, таких как обработка изображений и трассировка лучей, кто верит в эффективноемикрооптимизации (но мои идеи эффективной микрооптимизации были бы такими, как улучшение шаблонов доступа к памяти и макетов памяти для повышения эффективности кэша, а не устранение временных переменных из-за страха, что ваш компилятор или интерпретатор может выделить дополнительные регистры и / или использовать дополнительные инструкции).
Причина, по которой это не так интересно, заключается в том, что, как указано в комментариях, любой приличный оптимизирующий компилятор будет рассматривать эти два написанных вами как эквивалентные к тому времени, как он завершит оптимизацию промежуточного представления и сгенерируетокончательные результаты выбора команды / распределения регистров для получения окончательного результата (машинный код).И если вы не используете приличный оптимизирующий компилятор, то этот вид микроскопической эффективности, вероятно, является последним, о чем вы должны беспокоиться в любом случае.
Переменные области действия
Если оставить в стороне производительность, единственное беспокойство, которое у меня возникнет с этим соглашением, и я думаю, что в общем случае его следует применять свободно, это языки, которые не имеют понятия именованной константы, чтобы отличать ее от переменной.
В этих случаях, чем больше переменных вы вводите в мясистую функцию, тем больше интеллектуальных накладных расходов она может иметь по мере увеличения числа переменных с относительно широкой областью действия, что может привести к практическимбремя обслуживания и отладки в крайних случаях.Если вы представите случай, подобный этому:
some_variable = ...
...
some_other_variable = ...
...
yet_another_variable = ...
(300 lines more code to the function)
... в какой-то функции, и вы пытаетесь ее отладить, то эти переменные в сочетании с чудовищным размером функции начинают умножать сложностьпытаясь понять, что пошло не так.Это практическая проблема, с которой я столкнулся при отладке кодовых баз, охватывающих миллионы строк кода, написанных всеми видами людей (включая тех, которых больше нет в команде), где не так интересно смотреть на окно наблюдения местных жителей в отладчике и видеть дваПеременные страниц в какой-то чудовищной функции, которая, кажется, что-то делает неправильно (или в одной из функций, которые она вызывает).
Но это проблема, только когда она сочетается с сомнительными методами программирования, такими как написание функций, охватывающих сотниили тысячи строк кода.В этих случаях это часто улучшает все, просто сосредотачиваясь на создании функций разумного размера, которые выполняют одну четкую логическую операцию и не имеют более одного побочного эффекта (или, в идеале, ни одного, если функция может быть запрограммирована как чистая функция).Если вы разрабатываете свои функции разумно, то я бы не стал беспокоиться об этом вообще и предпочел бы то, что читается и легче всего понять с первого взгляда и, возможно, даже то, что наиболее доступно для записи и «податливо» (чтобы упростить внесение изменений в функцию, если вы ожидаетебудущая потребность).
Прагматичный взгляд на области переменных
Так что я думаю, что многие концепции программирования можно в некоторой степени понять, просто понимая необходимость суженияпеременные области.Люди говорят, избегайте глобальных переменных, таких как чума.Мы можем разобраться с тем, как это общее состояние может мешать многопоточности и как оно затрудняет изменение и отладку программ, но многие проблемы можно понять только благодаря стремлению сузить область действия переменных.Если у вас есть кодовая база, которая охватывает сто тысяч строк кода, то глобальная переменная будет иметь объем в сто тысяч строк кода как для доступа, так и для модификации, и грубо говоря, сто тысяч способов ошибиться.
В то же время этот прагматичный вид будет бессмысленным создавать единовременную программу, которая занимает всего 100 строк кода и не нуждается в расширении в будущем, избегая глобальных переменных, таких как чума, так как глобальные здесь только развиваются.так сказать, иметь 100 строкМежду тем, даже тот, кто избегает подобных чумы во всех контекстах, все же может написать класс с переменными-членами (включая некоторые излишние для «удобства»), реализация которых охватывает 8000 строк кода, и в этом случае эти переменные имеют гораздо более широкую область применения, чем дажеглобальная переменная в первом примере, и эта реализация может побудить кого-то спроектировать меньшие классы и / или уменьшить количество лишних переменных-членов, которые будут включены как часть управления состоянием для класса (что также может привести к упрощенной многопоточности и всеманалогичные преимущества (исключение глобальных переменных в некоторой нетривиальной кодовой базе).
И, наконец, будет склонен побудить вас писать и более мелкие функции, поскольку переменная ближе к вершине некоторой функции, занимающей 500 строккода также будет иметь довольно широкий охватТак или иначе, моя единственная забота, когда вы делаете это, - не допустить, чтобы область действия этих временных локальных переменных стала слишком широкой.И если они это сделают, то общий ответ не обязательно состоит в том, чтобы избегать этих переменных, но чтобы сузить их область.