2012-11-08 2 views
0

Je me demandais s'il y avait une meilleure alternative à l'utilisation de cette implémentation de rupture. J'essaie d'améliorer mes capacités et ce qui suit fonctionne vraiment. C'est juste que je n'arrête pas d'entendre parler de Break; comme étant la sortie facile et produit le code spaghetti potentiel qui n'a pas eu lieu ici mais encore. Sans la coupure, le message «Rien vendu au cours des deux dernières semaines» ne produirait la quantité stockée dans le groupement.Une meilleure boucle sans interruption;

+0

Pouvez-vous poster des liens vers où les gens sont Critiquer 'break'? –

+0

Qu'est-ce qui se passe avec les arbres? Et pourquoi voulez-vous arrêter de traiter le reste des arbres si l'un n'a pas été vendu? – cHao

+0

La boucle s'arrête au premier arbre qui ne satisfait pas à la date du test au cours des 2 dernières semaines et vendu. Êtes-vous sûr? – Aubin

Répondre

1

Puisque vous ne faites rien après la pause, si cela se produit. Vous pourriez aussi bien le remplacer par le retour.

public void getWoodSoldRecently(){ 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.WEEK_OF_YEAR, -2); 
for(Tree t : theTrees){ 
    if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){ 
     treesSold.add(t); 
     System.out.println(t.getTreeId() + " " + t.getTreeType()); 
    } 
    else{ 
     System.out.println("Nothing sold in the last 2 weeks"); 
     return; //Exit function 
    } 
} 

}

J'ai personnellement pas broblem avec des pauses, le retour cependant vous oblige à incorporer du code dans plus de fonctions, Wich est toujours bon.

0

La coupure n'est pas mauvaise par définition - elle peut être mal utilisée mais la façon dont vous l'utilisez est autorisée. Vous pouvez envisager de remplacer la rupture par un retour.

0

Je n'utilise pas cela break dans votre exemple résultera dans n'importe quel problème. Postant toujours une solution de contournement possible (éviter la rupture):

boolean bContinue = true; 
    int iSize = theTrees.size(); 
    for(int indx=0; indx < iSize && bContinue; indx++){ 
    Tree t = theTrees.get(indx); 
    if(t.getSimpleDateSold().getTime().after(cal.getTime()) 
     && t.getHasBeenSold()==true){ 
     treesSold.add(t); 
     System.out.println(t.getTreeId() + " " + t.getTreeType()); 
    } 
    else{ 
     System.out.println("Nothing sold in the last 2 weeks"); 
     bContinue = false;//This will stop the loop 
    } 
} 
6

Je suppose que vous ne voulez pas vraiment casser ici de toute façon. Sûrement vous voulez juste continuer avec le reste des arbres - juste parce que vous trouvez un arbre qui ne correspond pas à votre condition (par exemple, il n'est pas vendu), cela signifie-t-il vraiment qu'il ne peut y avoir des correspondants plus tard dans votre collection?

Votre méthode est nettement étrange de toute façon, en termes d'être une méthode get qui ne retour quoi que ce soit, mais ajoute des valeurs à une collection existante. C'est la première chose que je changerais.

+0

Vous avez en effet raison à ce sujet, j'ai effectivement une instruction if qui fait ce que vous dites mais ne l'a pas inclus ici. Je ne me suis pas encore habitué aux conventions de nommage et j'ai basé ma méthode get si elle a produit et rassemblé des données. – Melky

+1

@Melky: Il est difficile de vous donner des conseils sur une situation lorsque vous n'en montrez qu'une autre. Il n'y a aucun moyen de dire ce que je (ou tout autre répondeur) ferais avec votre code * real *, basé uniquement sur ce code non-représentatif. –

0

Le problème est que vous utilisez une boucle foreach qui ne vous permet pas d'utiliser des paramètres conditionnels. Si vous le convertir en une boucle, vous serez mieux:

boolean loopContinue = true; 

for(int i = 0; i < theTrees.size() && loopContinue; i++) { 
     Tree t = theTrees.get(i); 
     if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){ 
      treesSold.add(t); 
      System.out.println(t.getTreeId() + " " + t.getTreeType()); 
     } 
     else{ 
      System.out.println("Nothing sold in the last 2 weeks"); 
      loopContinue = false; //Stop the above 
     } 
    } 
} 

EDIT & Précision: je dis « mieux » ce qui signifie que vous aurez plus de contrôle de la boucle. Comme d'autres l'ont dit, l'utilisation de break n'est pas intrinsèquement mauvaise.

+0

Je préfère la version break par-dessus, définitivement. –

+0

C'est encore pire que 'break' - maintenant vous avez une variable magique. – cHao

+0

Oui, mais je réponds à sa question telle qu'elle a été publiée. Il cherchait des alternatives. La variable est incluse simplement pour la lisibilité alors que vous pouvez l'écrire complètement pour ne pas inclure le conditionnel de l'instruction if dans la boucle for. – Grambot

-1

Travailler avec un Iterator:

public void getWoodSoldRecently(){ 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.WEEK_OF_YEAR, -2); 
Iterator itr = theTrees.iterator(); 
boolen b = true; 
while (itr.hasNext() && b == true) { 
     if(t.getSimpleDateSold().getTime().after(cal.getTime()) && t.getHasBeenSold()==true){ 
      treesSold.add(t); 
      System.out.println(t.getTreeId() + " " + t.getTreeType()); 
     } 
     else{ 
      System.out.println("Nothing sold in the last 2 weeks"); 
      b = false; 
     } 
    } 
} 
+0

Les variables magiques sont bien pires que 'break', IMO. Au moins, quand je vois une pause, je sais que je saute ailleurs. – cHao

+0

vous avez probablement raison, en outre dans ce cas, vous avez besoin de deux autres variables. Mais la question était de savoir comment éviter la «rupture». Un ceci est un exemple. –

Questions connexes