Expressions and statements
ES.5
Держите области видимости небольшими
Причина
Читаемость. Минимизация удержания ресурсов. Предотвращение случайного неправильного использования значений.
Альтернативная формулировка: Не объявляйте имя в излишне широкой области видимости.
Пример
void use()
{
int i; // плохо: i излишне доступна после цикла
for (i = 0; i < 20; ++i) { /* ... */ }
// здесь i не используется намеренно
for (int i = 0; i < 20; ++i) { /* ... */ } // хорошо: i локальна для цикла for
if (auto pc = dynamic_cast<Circle*>(ps)) { // хорошо: pc локальна для if
// ... обработка Circle ...
}
else {
// ... обработка ошибки ...
}
}
Пример (плохой)
void use(const string& name)
{
string fn = name + ".txt";
ifstream is {fn};
Record r;
is >> r;
// ... 200 строк кода без намеренного использования fn или is ...
}
Эта функция и без того слишком длинная, но суть в том, что ресурсы, используемые fn и дескриптором файла is, удерживаются значительно дольше, чем необходимо, и позже в функции возможно непредвиденное использование is и fn. В данном случае имеет смысл вынести чтение в отдельную функцию:
Record load_record(const string& name)
{
string fn = name + ".txt";
ifstream is {fn};
Record r;
is >> r;
return r;
}
void use(const string& name)
{
Record r = load_record(name);
// ... 200 строк кода ...
}
Контроль
- Отмечайте переменные цикла, объявленные вне цикла и не используемые после него
- Отмечайте случаи, когда дорогостоящие ресурсы, такие как дескрипторы файлов и блокировки, не используются на протяжении N строк (для подходящего N)