[英]How can I refactor the mass if-else statement?
How can I refactor the mass if-else statement??如何重构大量 if-else 语句? I have lots of big if-else statements in my app, do I need to refactor all this code or just leave it alone?我的应用程序中有很多大的 if-else 语句,我需要重构所有这些代码还是只管保留它?
if (up > 80 && up < 140)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(y, 0, x);
}
else
{
if (down > 140)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(0, -y, x);
}
else if (down < 35)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(0, -y, -x);
}
else if (down > 35 && down < 140 && right > 0)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(-x, -y, 0);
}
else if (down > 35 && down < 140 && right < 0)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(x, -y, 0);
}
}
How can I refactor the mass if-else statement??如何重构大量 if-else 语句? I have lots of big if-else statements in my app, do I need to refactor all this code or just leave it alone?我的应用程序中有很多大的 if-else 语句,我需要重构所有这些代码还是只管保留它?
You can create a method like this:您可以创建这样的方法:
private static void Translate(bool distance, YourGoClas go, YourGoClas go2, double x, double y, double z)
{
if (distance)
{
go.transform.position = go2.transform.position;
}
go.transform.Translate(x, y, z);
}
And refactor:并重构:
if (up > 80 && up < 140)
{
Translate(distance, go, go2, y, 0, x);
}
else
{
if (down < 35)
{
Translate(distance, go, go2, 0, -y, -x);
}
else if (down < 140)
{
if (right > 0)
{
Translate(distance, go, go2, -x, -y, 0);
}
else if (right < 0)
{
Translate(distance, go, go2, x, -y, 0);
}
}
else // if (down > 140)
{
Translate(distance, go, go2, 0, -y, x);
}
}
The key is look for code almost equal and run in a separate method.关键是寻找几乎相同的代码并以单独的方法运行。 And try to do if conditions in order, only a single comparison when it's allow you separate all cases.并尝试按顺序执行 if 条件,只有在允许您分开所有情况时才进行一次比较。
I think you could apply extract method
which reduces duplicated code.我认为您可以应用extract method
来减少重复代码。
private void setPositionByDistance(boolean distance, Go go, Go go2) {
if (distance)
{
go.transform.position = go2.transform.position;
}
}
And use early return
pattern, which reduces unnecessary nested if-else
hierarchy.并使用early return
模式,这减少了不必要的嵌套if-else
层次结构。
Then your code will become better:那么你的代码会变得更好:
if (up > 80 && up < 140)
{
setPositionByDistance(distance, go, go2);
go.transform.Translate(y, 0, x);
return; // early return
}
if (down > 140)
{
setPositionByDistance(distance, go, go2);
go.transform.Translate(0, -y, x);
}
else if (down < 35)
{
setPositionByDistance(distance, go, go2);
go.transform.Translate(0, -y, -x);
}
else if (down > 35 && down < 140 && right > 0)
{
setPositionByDistance(distance, go, go2);
go.transform.Translate(-x, -y, 0);
}
else if (down > 35 && down < 140 && right < 0)
{
setPositionByDistance(distance, go, go2);
go.transform.Translate(x, -y, 0);
}
Try this尝试这个
private static void Foo(bool distance, YourGoClass go, YourGoClass go2, double x, double y, double z)
{
if (distance) go.transform.position = go2.transform.position;
go.transform.Translate(x, y, z);
}
And then you can change your code like this然后你可以像这样改变你的代码
if (up > 80 && up < 140)
{
Foo(distance, go, go2, y, 0, x);
}
else
{
switch(down)
{
case var _ when down > 140:
Foo(distance, go, go2, 0, -y, x);
break;
case var _ when down < 35:
Foo(distance, go, go2, 0, -y, -x);
break;
default:
if (right > 0) Foo(distance, go, go2, -x, -y, 0);
else Foo(distance, go, go2, x, -y, 0);
break;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.