这个重复代码的优雅解决方案?
A elegant solution to this repetitive code?
我有这段代码,但看起来应该有一种方法可以用更少的时间完成它 lines/code。
if (TargetX > Origin[0] + Range) TargetX = Origin[0] + Range;
if (TargetY > Origin[1] + Range) TargetY = Origin[1] + Range;
if (TargetX < Origin[0] - Range) TargetX = Origin[0] - Range;
if (TargetY < Origin[1] - Range) TargetY = Origin[1] - Range;
我使用的是一种称为 GML 的语言,但只要解决方案没有任何真正特定的内置函数,这应该是通用的。
回答你的问题并不容易。当然,您可以 dry 您的代码。
请注意,您可以将调用简化为:
abs(target - origin) < range
这会告诉您,在两个方向上,您的目标是否在 origin ± range
范围内。现在您知道了这一点,如果您的目标超出范围,您需要采取行动。这可以再次简化:您只需要检查 target
是否大于 origin
或反之亦然。
最后,您应该为目标和起点都使用数组,或者定义一个您可以调用的函数。显然,范围每次都是相同的。
您可能会使用一个函数:
f(target, origin, range) {
if (abs(target - origin) > range) {
target = (target - origin) < 0 ? target-range : target+range
}
}
现在看起来你的代码变长了,但也更容易维护:减少写>
而不是<
的风险,改一次函数就改所有检查等等。
我有这段代码,但看起来应该有一种方法可以用更少的时间完成它 lines/code。
if (TargetX > Origin[0] + Range) TargetX = Origin[0] + Range;
if (TargetY > Origin[1] + Range) TargetY = Origin[1] + Range;
if (TargetX < Origin[0] - Range) TargetX = Origin[0] - Range;
if (TargetY < Origin[1] - Range) TargetY = Origin[1] - Range;
我使用的是一种称为 GML 的语言,但只要解决方案没有任何真正特定的内置函数,这应该是通用的。
回答你的问题并不容易。当然,您可以 dry 您的代码。
请注意,您可以将调用简化为:
abs(target - origin) < range
这会告诉您,在两个方向上,您的目标是否在 origin ± range
范围内。现在您知道了这一点,如果您的目标超出范围,您需要采取行动。这可以再次简化:您只需要检查 target
是否大于 origin
或反之亦然。
最后,您应该为目标和起点都使用数组,或者定义一个您可以调用的函数。显然,范围每次都是相同的。
您可能会使用一个函数:
f(target, origin, range) {
if (abs(target - origin) > range) {
target = (target - origin) < 0 ? target-range : target+range
}
}
现在看起来你的代码变长了,但也更容易维护:减少写>
而不是<
的风险,改一次函数就改所有检查等等。