Использование одного и того же имени для вида переменной, обычно встречающейся во вложенной области видимости - PullRequest
0 голосов
/ 17 июня 2011

Я часто пишу такие вещи, как:

const auto end = some_container.end();
for( auto it = some_container.begin(); it != end; ++it )
{
    const auto &item_container = *it;
    const auto end = item_container.end()
    for( auto it = item_container.begin(); it != end; ++it )
    {
        do_awesome_stuff_with_the_iterator();
    }
}

За исключением имени второй переменной end и it, которые до сих пор я давал разные имена. Это плохой стиль / практика "повторно использовать" то же имя для другой переменной в под-области видимости? Я понимаю, что вы не сможете получить доступ к внешним end и it переменным, но это не обязательно. Я не думаю, что это сбивает с толку (странные суффиксные имена в моих глазах уродливее), но есть ли конкретная причина не делать этого?

Ответы [ 4 ]

3 голосов
/ 17 июня 2011

Поскольку у вас есть этот тег c++0x, почему бы вам просто не использовать std::foreach() с лямбда-функцией?

У меня нет удобного лямбда-компилятора, но нужно что-то вроде этого:

// Beware, brain-compiled code ahead!
std::foreach( some_container.begin()
            , some_container.end()
            , [](some_element& v) {
              std::foreach( v.begin()
                          , v.end()
                          , [](another_element& u) {
                            do_awesome_stuff_with_the_element(u);
                          }
            }
            );

С новым циклом for на основе диапазона это может стать еще болеечитабельно:

// Beware, brain-compiled code ahead!
for (auto& v: some_container)
    for(auto& u : v)
        do_awesome_stuff_with_the_element(u);
2 голосов
/ 17 июня 2011

Это зависит от контекста. В этом случае я бы предположил, что повторное использование it сомнительно, но end, вероятно, хорошо. Вы используете каждый экземпляр end только в одном, однозначном месте. Но кто-то, читающий внутренний цикл, может быть сбит с толку тем, что вы имеете в виду it, поскольку использование более удалено из объявления.

Конечно, кто-то, читающий любой цикл, может запутаться из-за того, что it означает для начала; Я бы с самого начала выбрал более подходящее имя, и затем повторное их использование должно быть более редким явлением.

2 голосов
/ 17 июня 2011

Единственная проблема с повторным использованием имен переменных в вашем случае, как вы сказали, заключается в том, что у вас нет доступа к переменным внешней области видимости.

И не в вашем случае, но это действительно может снизить читабельность кода, если вы используете переменные с одинаковыми именами для разных целей (в вашем случае это не проблема, поскольку и end, и it работают одинаково).

Существует также третья проблема, заключающаяся в том, что переменные с одинаковыми именами часто затрудняют процесс отладки, хотя, если вы используете только журналирование, а не средства отладки, это может вас не волновать.

1 голос
/ 17 июня 2011

Я думаю, что повторное использование одинаковых имен переменных является признаком того, что имена недостаточно описательны для этой функции.

Если вы собираетесь перебирать несколько контейнеров, имена переменных должны указывать, над чем они перебираются, связанные с контейнером или типами, содержащимися в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...