4

J'ai besoin de boucle à travers un certain nombre (xx). xx commence toujours à zéro. Mon problème est que si la variable moveDirection est +1 alors xx augmente jusqu'à ce qu'il atteigne le positif de range. Si moveDirection est -1, alors xx diminue jusqu'à atteindre le négatif de range.Comment réduire la duplication de code dans cet exemple

Dans le code ci-dessous, je l'ai fait en ayant un test if instruction pour moveDirection d'abord, puis je l'ai en double la boucle, et édité les valeurs pour chaque cas. Mon code se trouve dans ActionScript3, mais la langue n'a pas d'importance.

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

Y a-t-il une meilleure façon de procéder, peut-être sans duplication de la boucle for? S'il y a d'autres conseils, ce serait grandement apprécié.

Répondre

10
for (xx = 0; xx != range; xx += moveDirection) 
{ 
    if (hitTestPoint(xx, yy)) 
    { 
     return true; 
    } 
} 

Cela suppose que moveDirection est soit 1 ou -1 pour monter ou descendre, respectivement. De plus, vous devrez modifier légèrement votre plage pour que le! = Fonctionne correctement. Mais, il réduit le code.

+0

Je changerais le nom 'moveDirection' en' motionVector' ou quelque chose, pour être clair sur ce qu'il stocke. 'moveDirection' sonne trop comme une énumération ou quelque chose :) – porges

+0

True. J'étais juste paresseux et j'utilisais des variables prédéfinies, donc je n'avais pas besoin de les définir moi-même. : P –

+0

Très élégant! Merci beaucoup. Je suis toujours étonné par toutes les différentes façons de faire des boucles (ou d'autres boucles). –

0

Voici un exemple en Java (see also on ideone.com):

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

Ensuite, vous pouvez faire:

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

Si vous souhaitez recevoir étape non-unité, il est plus simple de définir un troisième paramètre comme suit:

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

Ensuite, vous pouvez faire:

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

Ce qui ne va pas; la condition de la deuxième clause de la boucle for diffère également. Et la direction pourrait avoir une magnitude supérieure à 1. – Borealid

1

Des regards du code, il ne compte pas vraiment dans quelle direction la boucle court - vous êtes juste retour si truehitTestPoint retours true pour une certaine valeur dans la gamme. Si c'est le cas, une autre possibilité serait quelque chose comme:

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

for (xx = start; xx!=stop; xx++) 
    if (hitTestPoint(xx,yy) 
     return true; 
+1

Si plusieurs valeurs de xx pour lesquels hitTestPoint (xx, yy) est vrai, ou surtout si hitTestPoint a des effets secondaires, ce peut certainement changer le comportement. –

1

Une autre possibilité:

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

C'est un bon. Cela signifie qu'il n'y a pas de chance de boucle infinie, où je me déplace dans la mauvaise direction pour aller. –