【问题标题】:Alternative to multiple use of if-else in the code base在代码库中多次使用 if-else 的替代方案
【发布时间】:2013-10-09 07:41:57
【问题描述】:

我有一大段代码可以处理某个参数的两个版本,比如说 ver1 和 ver2。

版本是一个运行时字段,我打算保留它,这样我就不必使用不同的标志构建代码,并且两个版本都可以使用相同的 lib 文件。

现在,有不同的字段适用于 ver1 和一些适用于 ver2。

所以在多个地方的代码中我必须这样做

if(ver1) {
    // set fields specific to ver1
}
else {
    // set fields specific to ver2
}

我不喜欢在代码中添加 if 语句的想法,因为代码看起来很丑。

这个有什么替代品吗?

我在想一些通用的内联/宏定义,其中只有在传递的标志为真时才设置字段?

另外,在优化方面,不应该比 if else 贵

@edit -- 代码内部组织的一些细节

无法发布代码的详细信息。但一个重要的事实是,它是一个庞大的遗留代码,需要升级并具有向后兼容性。

版本参数被传递给每个类,以决定要设置哪些字段以及忽略哪些字段。

【问题讨论】:

  • 写两个版本的函数怎么样?
  • 如果你在分支中有很多副作用并且不同版本尝试通过重构来减少分支。当您知道通常将哪些类型的字段设置在一起时,开始将这些字段提取到函数中。如果可能的通用功能,则提取一个接口。另请参阅:重构:改进现有代码的设计

标签: c++ c coding-style


【解决方案1】:

一个常用的解决方案是有两个类,分别代表版本 1 和版本 2,用一个通用基类定义与虚函数的接口。因此,您只会得到一个 if/else,然后虚函数表会负责选择正确的函数。

如果这不是一个合理的解决方案,那么 if-else 是最清晰的方法,我会说。

【讨论】:

  • @Dexter 您的问题在细节上非常模糊。也许您应该描述为什么它不适用于您的场景。你的方案是什么?
【解决方案2】:

您可以使用函数轻松地做到这一点。函数的基本目的是减少代码冗余。

#define VERSION1 25
#define VERSION2 55

void checkVersion(int vers)
    {
       switch(vers)
       {
         case VERSION1:
              code_Depending_On_Version1();
              break;


         case VERSION2:
              code_Depending_On_Version2();
              break;
        }
    }

【讨论】:

  • 这种方法的问题是有多个字段,根据版本和代码库中的不同位置设置。我最终会创建许多函数。
  • 如果你的意思是你的代码写得像嵌套的 if-else(就像人们在学校里做的那样),那么你真的需要重新考虑你的编码方法。我的意见是为与版本 1 相关的代码创建一个函数,并为版本 2 创建一个函数。
【解决方案3】:

如果只是装饰性的,那么:

void blabla0(bool ver1)
{
 if(ver1)
 {
  blabla1();
  return;
 }
 blabla2(); // save one else and two brackets, but get a return :-(
}

如果你在编译时总是知道参数,那么我会使用模板

template<bool ver> blabla0()
{
 if(ver1)
 {
  blabla1();
  return;
 }
 blabla2();
}

这既高效(编译器将构建函数的两个专用版本)又清晰。

我忘记了另一个:

void blabla0(bool ver1)
{
 ver1 ? blabla1(): blabla2();
}

或者按照 Mats Petersson 的建议,使用具有两个专用于每个版本的派生类的基本虚拟类。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多