对嵌套范围中经常重复出现的变量类型使用相同的名称

Using same name for kind of variable commonly re-occurring in a nested scope

本文关键字:类型 变量 范围 常重复 嵌套      更新时间:2023-10-16

我经常写这样的东西:

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();
    }
}

除了第二个变量endit的名称,到目前为止,我已经给出了不同的名称。为子范围中的另一个变量"重用"相同的名称是否是一种糟糕的风格/做法?我知道您将无法访问外部endit变量,但这不是必须的。我不认为这令人困惑(奇怪的后缀名字在我眼中更丑陋),但有具体的理由不这么做吗?

既然已经标记了c++0x,为什么不简单地将std::foreach()与lambda函数一起使用呢?

我手头没有一个支持lambda的编译器,但应该有这样的功能:

// 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);
                          }
            }
            );

然而,有了新的基于范围的循环,这可能会变得更加可读:

// Beware, brain-compiled code ahead!
for (auto& v: some_container)
    for(auto& u : v)
        do_awesome_stuff_with_the_element(u);

正如您所说,在您的案例中重用变量名的唯一问题是您无法访问外部作用域变量。

在您的情况下不是这样,但如果您出于不同的目的使用具有相同名称的变量,这确实可能会降低代码的可读性(在您的案例中,这不是问题,因为endit的工作方式相同)。

还有第三个问题,具有相同名称的变量通常会使调试过程变得困难,尽管若您只使用日志记录而不使用调试器工具,那个可能就不需要担心了。

这取决于上下文。在这种情况下,我建议重用it是有问题的,但end可能是可以的。您只能在一个明确的位置使用end的每个实例。但是,阅读内部循环的人可能会对您所指的it感到困惑,因为声明中更多地删除了使用。

当然,阅读任何一个循环的人可能会被it一开始的意思弄糊涂;我会从一开始就选择一个更好的名字,然后重用它们应该是一种更罕见的情况。

我认为重复使用相同的变量名是一个迹象,因为这些名称对该函数的描述不够。

如果要对多个容器进行迭代,变量名应该指示它们要对哪些内容进行迭代,这些内容与容器或容器中包含的类型有关。