我经常发现自己在If-Else链的所有分支的末尾重复一些代码:

示例:

if (cond1) {
    // [...] code 1

    // repeated code
} else if (cond2) {
    // [...] code 2

    // repeated code
} else if (cond3) {
    // [...] code 3

    // repeated code
}

在这里沿着DRY principle号公路走最好的方法是什么?

我想到了以下几点:

  • 把重复的代码放在一个函数中:你仍然需要在每个分支中重复调用这个函数.
  • 在If-Else链之后有一个新的If条件(所有先前条件的大"或"):您需要重复前面的条件.
  • 为什么没有为此而存在的东西呢?我希望在If-Else链之后可以使用一个关键字,对于异常来说,有点像finally.只有当前面的条件之一被证明为真时,它才会执行代码:
if (cond1) {
    // [...] code 1
} else if (cond2) {
    // [...] code 2
} else if (cond3) {
    // [...] code 3
} wrapup {
    // repeated code
}

如何在代码中解决此问题?

Note:这个问题被贴上了C语言的标签,但我也很感兴趣地看到其他编程语言的解决方案可能对这种程序流/路径有很好的构造.

推荐答案

//  Start block in which we expect to do wrap-up code except in unmatched case.
do
{
    if (Condition0)
    {
        Code0;
    }
    else if (Condition1)
    {
        Code1;
    }
    else if (Condition2)
    {
        Code2;
    }
    else
        break;

    //  Perform the wrap-up code in all cases except the above else-break.
    WrapUpCode;
} while (0);

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

常数函数指针优化

当main函数调用被重构时,C函数给出错误的结果

C/SDL程序,渲染不使用我的渲染器

C:scanf(%d&q;,...)输入只有一个减号

试图从CSV文件中获取双精度值,但在C++中始终为空

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

在txt文件中找到指定的字符串,并从数字中减go 相同的值

C语言中的外部关键字

在C++中允许使用字符作为宏参数

使用%f格式说明符打印整数值

如何修复我的qsort()算法?它每次都给出不同的结果

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

在我的函数中实现va_arg的问题

UpDown控制与预期相反

struct 中的qsort,但排序后的 struct 很乱

如何使用 VLA 语法使用 const 指针声明函数

如何用用户输入的多个字符串填充数组?

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?