Элегантное решение этого повторяющегося кода? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть этот код, но похоже, что должен быть способ сделать это с меньшим количеством строк / кода.

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, но это должно быть универсальным до тех пор, пока в решении нет действительно определенных c встроенных функций.

1 Ответ

2 голосов
/ 28 марта 2020

Нелегко ответить на ваш вопрос. Конечно, вы можете 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
    }
}

Теперь похоже, что ваш код стал длиннее, но его также легче поддерживать: уменьшите риск написания > вместо <, измените функцию один раз, чтобы изменить все проверки и т. д.

...