【问题标题】:Handling lots of variable declarations处理大量变量声明
【发布时间】:2012-10-22 01:50:01
【问题描述】:

我正在实现一个类,并且我有一个函数使用大量需要声明和初始化的变量来执行操作。

我希望变量声明不要弄乱函数并执行以下操作:

doFunction(){
  declare();

  //Do things with variables declared in declare()
}
void declare(){
  //declare lots of variables here
}

这不起作用,因为变量的作用域是 declare() 并且 doFunction() 看不到。处理这个问题的明智方法是什么?

【问题讨论】:

  • 可能有不同的处理方式,具体取决于您的问题到底是什么。您能否提供更多背景信息?解决方案的范围从重构代码到制作包含所有变量的支持类,再到制作宏。
  • 没有庞大的功能。不要污染范围。使用容器。以合乎逻辑的方式考虑因素。
  • 如果你的函数需要太多变量以至于它成为一个问题,我认为函数的设计可能存在问题,它实际上应该被拆分为多个函数或否则重新设计。我认为这个可能meta.stackexchange.com/questions/66377/what-is-the-xy-problem 的一个例子,你已经意识到你的函数太大/太复杂,并决定解决方案是隐藏变量声明并询问这个而不是问题本身.不过我可能错了:)

标签: c++ variables scope


【解决方案1】:

由于您声明的每个变量都必须分配一个值,因此您应该将声明与初始化结合起来。换句话说,而不是

int x;
double y;
std::string z;
x = 1;
y = 2.0;
z = "3";

这样做:

int x = 1;
double y = 2.0;
std::string z("3");

这几乎是你可以用本地人推动这种方法的程度:声明变量是函数体的重要组成部分,你不能(并且可以说不应该)将它移动到远程位置。

你也可以将成员函数移动到嵌套的私有类中,将局部变量移动到类中,并在那里进行计算:

class specialCalc {
    int x;
    double y;
    std::string z;
    specialCalc() : x(1), y(2.0), z("3") {}
public:
    int calculate() {
        ...
    }
};

void doFunction() {
     specialCalc calc;
     cout << calc.calculate() << endl;
}

PS:我故意不提及基于预处理器的解决方案,因为它们会对可读性产生负面影响。

【讨论】:

    【解决方案2】:

    我并不是真的提倡这一点,但是:

    struct Declare
    {
        int x;
        float y;
        char z;
        vars() :x(1),y(3.14),z('z') {}
    };
    
    void doFunction()
    {
        Declare vars;
        // use vars.x, vars.y and vars.z as your variables
    }
    

    【讨论】:

    • 你得到的方法有什么问题?您将大量相关数据放入一个简单的结构中。我会暂时 +1,直到你能给我一个你不推荐它的充分理由。
    • @ahenderson:解决OP描述的“问题”的方法没有问题。我的意思是 OP 的问题不是真正的问题,或者至少,他正在以错误的方式解决它。我同意问题下的cmets。如果函数变得如此之大以至于变量的声明实际上使函数更难以理解,则需要重构。我没有从数据相关的问题中得到任何意义,除了它们在同一个函数中使用的事实。
    【解决方案3】:

    您有多种选择:

    1) 克服它。如果您需要大量变量,您将需要忍受需要在某处声明它们的事实。

    2) 将它们作为成员变量放入类或结构中,这样您就可以在 .h 文件中声明它们,它们将在 .C/.cpp 文件中不可见。

    3) 将它们聚合成一个数组,只声明数组并在for() 循环或其他东西中初始化它们。这只有在它们都是相似的类型并且你不做愚蠢的事情时才有效,比如“索引 4”是我的“计数器对象”,而“索引 5”是我要打印到的“东西”屏幕”,然后您就失去了与变量本身关联的名称,这在以后阅读代码时非常有用(当然)。

    4) 将它们放在其他地方的定义语句中:

    #define MYVARS int a; char b[1024]; ...
    
    void funstuff() {
        MYVARS
    }
    

    5) 修改 IDE 以便在您查看代码时隐藏/折叠变量声明。

    请注意,在所有这些选择中,数字 1 仍然可能是正确答案 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 2016-03-09
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多