这个重复代码的优雅解决方案?

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
    }
}

现在看起来你的代码变长了,但也更容易维护:减少写>而不是<的风险,改一次函数就改所有检查等等。