什么是更好的实践:重复代码或使用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;
        }

例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可能会增加bug的可能性,因为代码难度增加。 让我们来看看这个令人尴尬的错误。 如果开发者没有使用goto ,那就不会有这样的问题!

奖励积分

  • 你可以使用enums来选择案例,所以case 3: => 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是案例4的特例吗?

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

    如果案例3和4不相关,则重复代码更好。

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


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

    我没有看到第一个代码示例的主要问题。 如果你需要,你也可以拆分bc处理,如果这是有道理的。

    你应该考虑什么更重要:

  • 代码可读性;
  • 最少的代码行数;
  • 这段代码多久改变一次? 当它变化很大并且依赖可能会丢失时,你可能不想使用goto
  • 链接地址: http://www.djcxy.com/p/84499.html

    上一篇: What is the better pratice: duplicate code or use goto statement?

    下一篇: Is empty case of switch in C# combined with the next non