如何重构大量 if-else 语句?
How can I refactor the mass if-else statement?
如何重构大量 if-else 语句??我的应用程序中有很多大的 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);
}
}
如何重构大量 if-else 语句??我的应用程序中有很多大的 if-else 语句,我需要重构所有这些代码还是只管保留它?
您可以创建这样的方法:
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);
}
并重构:
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);
}
}
关键是在单独的方法中寻找几乎相等的代码和 运行。并尝试按顺序执行 if 条件,只有在允许您分开所有情况时才进行一次比较。
我认为您可以应用 extract method
来减少重复代码。
private void setPositionByDistance(boolean distance, Go go, Go go2) {
if (distance)
{
go.transform.position = go2.transform.position;
}
}
并使用 early return
模式,减少了不必要的嵌套 if-else
层次结构。
那么你的代码会变得更好:
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);
}
试试这个
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);
}
然后您可以像这样更改您的代码
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;
}
}
如何重构大量 if-else 语句??我的应用程序中有很多大的 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);
}
}
如何重构大量 if-else 语句??我的应用程序中有很多大的 if-else 语句,我需要重构所有这些代码还是只管保留它?
您可以创建这样的方法:
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);
}
并重构:
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);
}
}
关键是在单独的方法中寻找几乎相等的代码和 运行。并尝试按顺序执行 if 条件,只有在允许您分开所有情况时才进行一次比较。
我认为您可以应用 extract method
来减少重复代码。
private void setPositionByDistance(boolean distance, Go go, Go go2) {
if (distance)
{
go.transform.position = go2.transform.position;
}
}
并使用 early return
模式,减少了不必要的嵌套 if-else
层次结构。
那么你的代码会变得更好:
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);
}
试试这个
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);
}
然后您可以像这样更改您的代码
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;
}
}