c++ - 嵌套冗余 'if' 条件

标签 c++ c if-statement

是否有更好(或更简洁)的方式来编写以下代码?

if(conditionX)
{
    if(condition1)
    {
        // code X1
    }
    else if(condition2)
    {
        // code X2
    }
}
else if(conditionY)
{
    if(condition1)
    {
        // code Y1
    }
    else if(condition2)
    {
        // code Y2
    }
}

我还有几个条件,但我想你明白了。

最佳答案

有四种方法可以解决这个问题,但没有一种是通用的:

  1. 保持原样 - 这里没有太多的代码重复。如果计算 condition1condition2 很棘手,请预先计算它们并将它们存储在 bool 变量中
  2. 使 conditionXconditionY 产生一个结果,让您统一 condition1condition2 - 这并不总是可能的,但在某些情况下,您可以准备一个变量来统一两个分支中的事件,例如,通过使用函数指针或 lambda。
  3. 将处理逻辑放入具有虚函数的子类中以消除条件逻辑 - 只有当您的初始设计错过了子类化的机会时,这才有可能。本质上,这种方法将关于 conditionX/conditionY 的决定推到创建子类的地方,然后通过调用适当的覆盖来“重用”该决定界面中的虚函数。
  4. 创建一个代表所有三个条件的数字组合,并转换为 switch - 这个技巧统一了条件,减少了嵌套。

这是最后一种方法的示例:

int caseNumber = ((conditionX?1:0) << 3)
               | ((conditionY?1:0) << 2)
               | ((condition2?1:0) << 1)
               | ((condition1?1:0) << 0);
switch (caseNumber) {
    case 0x09:
    case 0x0D:
    case 0x0F: // code X1
        break;
    case 0x0A:
    case 0x0E: // code X2
        break;
    case 0x05:
    case 0x07: // code Y1
        break;
    case 0x06: // code Y2
        break;
}

关于c++ - 嵌套冗余 'if' 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22479162/

相关文章:

c++ - 为什么当我调用 UpdateData(FALSE) 时我的对话框没有立即更新?

c++ - 从 cpprest lambda 表达式访问自动变量

R 问题 : ifelse producing unexpected results

c++ - 不同typeid的if语句

c++ - 警告 : control may reach end of non-void function [-Wreturn-type]

c++ - 并行 for 循环体的最佳大小

c - 这个递归 GCD 函数正确吗?

c - 在 C 中使用大数组时出现 EXCEPTION_ACCESS_VIOLATION

c# - 将 wchar_t** 从 C++ 编码到 C# 作为输出参数?

R cumsum 与 if 条件