什么是更好的做法:重复代码或使用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;
}
这得看情况。
情况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
,因为它使你的代码不容易理解和复制。
我认为你的第一个代码样本没有什么大问题。如果需要的话,还可以拆分b
和c
的处理。
你应该考虑哪个更重要:
- 代码可读性;
- 最小代码行数;
- 这段代码多久更改一次?当它变化很大,依赖关系可能会丢失,你可能不想使用
goto
。
一般来说,使用goto
被认为是不好的做法(这是正确的),但使用goto
仅用于结构化控制语句的前跳通常被认为是可以的,特别是如果替代方法是使用更复杂的代码。
下面是一个例子:
for (...) {
for (...) {
...
if (something)
goto end_of_loop;
}
}
end_of_loop:
这里您可以查看goto
的其他可接受的用法。
因此,goto
将被认为是一个不好的实践。但是,正如我所说,它仍然可以被使用。