如何隐藏局部变量

how to hide local variables

在我的代码中,有时会有一个很长的函数,为了避免弄乱局部变量,我会用一对大括号来包含细节,这样局部变量就不会对代码的其余部分可见,例如:

bool pricing_deals()
{
  //prepare deal type lookup table
  vector<DealType> deal_types; // deal type lookup table
  {
    vector<DealType> deal_types_TRF; 
    vector<DealType> deal_types_DCI; 
    ...
    // code that prepare deal_types by merging deal_types_TRF and deal_types_DCI etc
  }
  // from now on deal_types_TRF and deal_types_DCI are invisible

  //prepare ccy pair lookup table
  vector<CcyPair> ccy_pairs; // ccy pair lookup table
  {
    // code that prepare ccy_pairs;
  }
  // from now on local variables preparing ccy_pairs are invisible

  // real computation starts
  ...
}

我想知道这是否是一个好的做法,或者您建议使用其他方法吗?

p.s。在这种情况下,我不希望把它分解成更小的功能,因为子逻辑不太可能被其他人复用,重构会导致很多参数被传递,这会增加复杂度。

在某些情况下,如果您不能将函数拆分为多个较小的函数,这是一个很好的做法,但您必须知道,当局部变量超出范围时,它的析构函数将被调用,这可能是也可能是没问题,例如,如果您假设是这样的:

#include <iostream>
#include <vector>
#include <string>

int main(int argc, const char* argv[])
{
  using namespace std;

  vector<string>::const_iterator it;

  {
    const vector<string> data = {"foo", "bar", "baz"};
    it = data.begin();
  }

  cout << *it << endl;

  return 0;
}

然后在这里你将一个 const_iterator 存储到一个 vector 中,它在范围关闭时被释放,所以你会得到未定义的行为。这并不意味着您的解决方案不是一个好的解决方案,它只是意味着您必须考虑到任何特定的缺点。

如果您需要在一个函数的多个部分分配很多资源,这样您就可以逐渐分配和释放它们,而无需内存峰值,这也很好。