什么是更好的实践:重复代码或使用goto语句?

时间:2014-03-27 13:39:19

标签: c# goto

我现在正在研究C#,遇到以下情况,有什么更好的实践,重复像“EX 1”这样的代码或使用像{EX 2“这样的goto语句? 我不想要个人意见。

        // 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;
        }

4 个答案:

答案 0 :(得分:5)

这取决于。

案例3是案例4的特例吗?

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

如果案例3&amp; 4是无关的,然后复制代码更好。

如果你的真实情况很小,线条很少,我宁愿复制代码,因为它简单易读。

答案 1 :(得分:1)

我个人不喜欢goto,因为这会让您的代码不易理解和重现。

我发现您的第一个代码示例没有重大问题。如果需要,您还可以分割bc的处理,如果有意义的话。

你应该考虑更重要的事情:

  • 代码可读性;
  • 最少的代码行数;
  • 此代码多久更改一次?当它发生很大变化并且依赖关系可能会丢失时,您可能不想使用goto

答案 2 :(得分:1)

示例1的利弊

+ Common structure
+ Simple to understand logic
- More lines of code
- Code repetition

示例2的利弊

+ Fewer lines of code
+ No code repetition
- It complicates logic
- It is not commonly used in production code

底线

我更喜欢示例1,因为在这个特定的实例中,节省的费用很少,但逻辑变得更复杂。可以说,Goto,如果更多的人开始使用相同的代码,代码的难度增加,则会增加错误的可能性。我们来看看this embarrassing bug。如果开发人员没有使用goto,就不会出现这样的问题!

奖励积分

  • 您可以使用enums进行案例选择,因此case 3: =&gt; case CarPart.SteeringWheel
  • 确保每个case都有break;
  • 确保有default案例
  • 考虑使用多态和继承而不是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 
    

答案 3 :(得分:1)

一般来说,使用gotoconsidered to be bad practice(并且正确地如此),但仅使用goto进行结构化控制语句的向前跳转通常被认为是正常的,尤其是另一种方法是使代码更复杂。

以下是一个例子:

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

end_of_loop:

Here您检查goto的其他一些可接受的用法。

因此,goto将被视为不良做法。但是,正如我所说,它仍然可以使用。