使用花括号分隔C ++中的代码

时间:2013-08-21 03:11:53

标签: c++ code-formatting

我真正喜欢IDE的一个方面是能够“最小化”代码段,以便:

while(conditions){
  // Really long code...
}

可以成为:

while(conditions){ // The rest is hidden

我的问题是这样的东西是否可以接受格式化

// Code
{
  // More code
}
// Code

我知道在括号内完成的任何事情都有限制范围,但我也可以在外部范围内编辑变量。

所以,对于一个简短的,不必要的例子

int x = 1;
{ // Create new variable, add and output
  int y = 2;
  cout << x + y;
}

会变成:

int x = 1;
{ // Create new variable, add and output (The rest of the code is hidden)

那么这可以接受,还是避开?

这是我想要隐藏的一个真实例子。

/// Add line to msg vector
// Check to see if each side X is needed
if(uniqueSide && line == 1){
    // Create stringstream to hold string and int (e.g. "Message " + 1 + " - Side " + 1
    stringstream tempString;
    // Add full line to stringstream. validMessages.length() + 1 will make Message X be incremental
    tempString << "Message " << (validMessages.length() + 1) << " - Side " << numSide;
    // Then append full string (e.g. "Message 1 - Side 1") to msg
    msg.append(tempString.str());
}
// Else just add Message X using same method as above
else if(line == 1){
    stringstream tempString;
    tempString << "Message " << (validMessages.length() + 1);
}

// Add each line to msg vector with double space indent and (width) before each line
stringstream tempString;
tempString << setprecision(5) // Makes width be output as 10.325 or 100.33
           << "  (" << width << ") " << tempInput
msg.append(tempString.str());

感谢。

1 个答案:

答案 0 :(得分:5)

至少在我看来,如果你需要(甚至想要)这么多,你可能不会很好地构建你的代码。

隐藏代码的兴趣往往表明你可能有太多代码被挤在一起,最好分成更有意义的函数或(通常更好)通用算法。

我想详细介绍一些有关如何改进代码的更具体的建议,但是当问题如此笼统,并且它包含的小代码缺少任何上下文时,很难做到这一点,所以它是几乎不可能猜出它代表什么,这是你需要做的第一件事来改善它。

那就是说:作为一般规则,我认为添加一个不受流控制语句控制的块是完全合理的 - 但是通常 来控制对象的生命周期 - 如果你想要创建和销毁的东西,使用RAII对象并把它放在一个块中,所以当执行退出块时,它会被自动销毁。

编辑:至少在我看来,你的样本看起来很成熟(过期了?)进行了一些严肃的重构。

/// Add line to msg vector
// Check to see if each side X is needed
if(uniqueSide && line == 1){
    // Create stringstream to hold string and int (e.g. "Message " + 1 + " - Side " + 1
    stringstream tempString;
    // Add full line to stringstream. validMessages.length() + 1 will make Message X be incremental
    tempString << "Message " << (validMessages.length() + 1) << " - Side " << numSide;
    // Then append full string (e.g. "Message 1 - Side 1") to msg
    msg.append(tempString.str());
}
// Else just add Message X using same method as above
else if(line == 1){
    stringstream tempString;
    tempString << "Message " << (validMessages.length() + 1);
}

现在,你的else子句并没有真正做任何事情(在tempString放置一些东西,但那是本地的,所以它在从块中退出时消失。让我们假设评论是正确的,所以其他应该有:

    msg.append(tempString.str());

退出之前。在这种情况下,代码的两条腿足够相似,它们应该(大部分)合并:

stringstream tempString;
tempString << Message << validMesssages.length()+1;
if (uniqueSide && line == 1)
    tempString << " - Side " << numSide;
msg.append(tempString.str());

然后,由于最后一部分是无条件执行的,我们可以将其余的代码与前面的代码合并(并且在此过程中,消除了相当多的代码,因此我们最终得到类似的东西:

stringstream tempString;
if (line == 1) {
    tempString << "Message " << validMesssages.length()+1;
    if (uniqueSide) tempString << " - Side " << numSide;
}
tempString << setprecision(5) << " ( " << width << " ) " << tempInput;
msg.append(tempString.str());    

从那里开始,问题在于将它转换为函数或函子是否有意义,因此调用代码最终会像:

msg.append(msg(line, validMessages, uniqueSide, numSide, width, tempInput));

你是否愿意这样做,只有你可以说。就个人而言,我认为这取决于你是否在许多地方编写类似的代码。如果这是唯一一个像这样的代码的地方,我可能会离开它,但如果你需要两个(或更多)位置的相同代码,一个函数开始变得更有意义。