Как уменьшить дублирование кода в этом примере - PullRequest
4 голосов
/ 07 июля 2010

Мне нужно перебрать номер (хх). хх всегда начинается с нуля. Моя проблема в том, что если переменная moveDirection равна +1, то xx увеличивается, пока не достигнет положительного значения range. Если moveDirection равно -1, то xx уменьшается до достижения отрицательного значения range.

В приведенном ниже коде я сделал это, сначала проверив оператор if для moveDirection, затем продублировал цикл for и отредактировал значения для каждого случая. Мой код написан на ActionScript3, но язык не имеет значения.

var p:Point;
var xx:int;

if (moveDirection > 0)
{
    for (xx = 0; xx < range; xx++)
    {
        if (hitTestPoint(xx, yy))
        {
            return true;
        }
    }
}
else 
{
    for (xx = 0; xx > range; xx--)
    {
        if (hitTestPoint(xx, yy))
        {
            return true;
        }
    }
}

Есть ли лучший способ сделать это, возможно, без дублирования цикла for? Если есть какой-либо другой совет, он будет очень признателен.

Ответы [ 4 ]

10 голосов
/ 07 июля 2010
for (xx = 0; xx != range; xx += moveDirection)
{
    if (hitTestPoint(xx, yy))
    {
        return true;
    }
}

Предполагается, что moveDirection будет либо 1, либо -1 для повышения или понижения соответственно.Кроме того, вам придется немного изменить свой диапазон, чтобы! = Работал правильно.Но это сокращает код.

1 голос
/ 07 июля 2010

Другая возможность:

int i;
for (i = abs(range), xx = 0; --i >= 0; xx += moveDirection){
  if (hitTestPoint(xx, yy) return true;
}
1 голос
/ 07 июля 2010

Судя по виду кода, не имеет значения, в каком направлении работает цикл - вы просто возвращаете true, если hitTestPoint возвращает true для некоторого значения в диапазоне. Если это так, другая возможность будет выглядеть примерно так:

var start:int = min(0, range);
var stop:int = max(0, range);

for (xx = start; xx!=stop; xx++)
    if (hitTestPoint(xx,yy)
        return true;
0 голосов
/ 07 июля 2010

Вот пример на Java ( см. Также на ideone.com ):

static void go(final int range, final int direction) {
    for (int i = 0; i != direction*range; i += direction) {
        System.out.println(i);
    }       
}

Тогда вы можете сделать:

        go(5, +1); // 0, 1, 2, 3, 4
        go(5, -1); // 0, -1, -2, -3, -4

Если вы хотите учесть шаг, не связанный с единицей, проще всего определить третий параметр следующим образом:

static void go(final int range, final int step, final int direction) {
    for (int i = 0; i < range; i += step) {
        System.out.println(i * direction);
    }       
}

Тогда вы можете сделать:

        go(10, 3, +1); // 0, 3, 6, 9
        go(10, 3, -1); // 0, -3, -6, -9
...