什么是更好的做法:重复代码或使用goto语句

本文关键字:代码 语句 goto 更好 什么 | 更新日期: 2023-09-27 17:53:55

我现在正在学习c#,遇到了以下情况,什么是更好的做法,复制代码如"EX 1"或使用goto语句如"EX 2"?我不想听个人意见。

        // EX 1: 
        switch (a)
        {
            case 3:
                b = 7;
                c = 3; // duplicate code <-|
                break; //                    |
            case 4:    //                    |
                c = 3; // duplicate code --|
                break;
            default:
                b = 2;
                c = 4;
                break;
        }

        // EX 2: 
        switch (a)
        {
            case 3:
                b = 7;
                goto case 4; // not duplicate code and use goto statement
            case 4:
                c = 3;
                break;
            default:
                b = 2;
                c = 4;
                break;
        }

什么是更好的做法:重复代码或使用goto语句

这得看情况。

情况3是情况4的特殊情况吗?

在这种情况下,goto可能是有序的,因为如果我们在稍后的时间点为情况4添加一些新的行为,那么情况3也会自动获得。

If case 3 &4是不相关的,那么复制代码是更好的。

如果你的实际情况是这么小,只有这么几行,我宁愿重复代码,因为简单和可读性。

例1利弊

<>之前+公共结构+逻辑简单易懂-更多的代码行-代码重复之前

例二利弊

<>之前+更少的代码行+无代码重复-使逻辑复杂化-在生产代码中不常用之前

底线

我更喜欢示例1,因为在这个特定的实例中,节省是最小的,但逻辑变得更复杂。如果越来越多的人开始编写相同的代码,随着代码难度的增加,Goto可能会增加出现bug的几率。让我们来看看这个令人尴尬的bug。如果开发者没有使用goto,就不会有这样的问题!

加分

  • 您可以使用enums进行案例选择,因此case 3: => case CarPart.SteeringWheel
  • 确保每个case都有一个break;
  • 确保有一个default case
  • 考虑使用多态性和继承来代替switch case

    ICarPart part1 = new SteeringWheel();
    ICarPart part2= new Mirror();
    var parts = new List<ICarPart>() {part1, part2};
    // now call your original method on the parts
    // no more need for a switch case 
    

我个人不喜欢goto,因为它使你的代码不容易理解和复制。

我认为你的第一个代码样本没有什么大问题。如果需要的话,还可以拆分bc的处理。

你应该考虑哪个更重要:

  • 代码可读性;
  • 最小代码行数;
  • 这段代码多久更改一次?当它变化很大,依赖关系可能会丢失,你可能不想使用goto

一般来说,使用goto被认为是不好的做法(这是正确的),但使用goto仅用于结构化控制语句的前跳通常被认为是可以的,特别是如果替代方法是使用更复杂的代码。

下面是一个例子:

for (...) {
    for (...) {
        ...
        if (something)
            goto end_of_loop;
    }
}
end_of_loop:

这里您可以查看goto的其他可接受的用法。

因此,goto将被认为是一个不好的实践。但是,正如我所说,它仍然可以被使用。