2010-09-20 4 views
4

Est-ce considéré comme un style médiocre/décourager d'ignorer la variable de boucle dans une instruction for-each dans Java?Est-il mauvais de ne pas utiliser la variable de boucle dans chaque instruction en Java?

J'ai un code ressemble ressemble un peu comme ce qui suit:

public void makeChecklist(final List<File> inputSrcs){ 

    for(File src : inputSrcs){ 
     System.out.print(src.getName() + "\t"); 
    } 
    System.out.println(); 


    for(File src : inputSrcs){ 
     //Not using "src" in this body! 
     System.out.print("[ ]\t"); 
    } 
    System.out.println(); 

} 

Est-ce une mauvaise idée? Une raison de ne pas faire les choses de cette façon? Cela semble tellement plus propre que d'utiliser une boucle normale.


PS- présumer que pour l'exemple ci-dessus, je veux que les cases à cocher apparaissent sous les noms, l'exemple est contraint à illustrer ma question aussi simple que possible.

Répondre

2

Je pense que si vous allez le faire, le commentaire supprime une grande partie de l'ambiguïté/confusion potentielle.

8

Cela semble certainement étrange. Je le rendre plus clair que c'est seulement le nombre qui compte avec une boucle:

for (int i = 0; i < inputSrcs.size(); i++) { 
    System.out.println("[ ]\t"); 
} 

Je pense que cela l'intention plus claire. Bien que, comme cela a été souligné dans les commentaires, nous ne faisons que remplacer une variable «factices» par une autre dans ce qui précède. Ce que j'aime à ce sujet, c'est qu'il explicitement appelle size(), ce qui, je crois, montre que la taille est importante.

Dans un langage plus expressif que vous pourriez trouver quelque chose pour indiquer « Je veux juste d'exécuter le corps n fois » qui serait plus joli encore:

inputSrcs.size().times() { 
    System.out.println("[ ]\t"); 
} 

(qui peuvent ou peuvent ne pas être valide Groovy :)

EDIT: une autre réponse évidente se présente à moi, ce qui aurait dû se produire avant:

printRepeatedly("[ ]\t", inputSrcs.size()); 

... 

private static void printRepeatedly(String text, int count) { 
    for (int i = 0; i < count; i++) { 
     System.out.println(text); 
    } 
} 

maintenant dans la méthode d'appel, le sens est tout à fait évident ... un nd dans printRepeatedly nous n'avons même pas ont le contexte d'une liste, donc nous ne pouvions pas être en train d'essayer d'utiliser les données. À ce stade, la variable factice i est assez évidemment une variable fictive, et le nom de la méthode rend évident pourquoi nous voulons ce comportement.

+2

Je ne suis pas du tout d'accord. Je vois le code de l'OP en imprimant une case à cocher pour chaque fichier. L'intention là-bas est * crystal * clair, et en ajoutant une variable de compteur et tout ce qui boue les eaux. – cHao

+0

@cHao: Eh bien, je sais que * I * chercherait l'utilisation de 'src' dans la deuxième boucle, en fronçant les sourcils quand je ne pouvais pas le voir. (En supposant qu'il n'y avait pas le commentaire, bien sûr.) –

+1

Eh bien, vous remplacez la variable en boucle qui est ignorée par un compteur qui est ignoré - pas sûr si cela est préférable. – zigdon

0

Semble parfaitement clair pour moi. Vous constaterez que les sauts de ligne ajoutés par println() - par opposition à print() - feront en sorte que vos cases ne coïncident pas vraiment avec autre chose que votre marge de gauche.

+0

Assez vrai, je vais corriger le code dans cette question, mais je n'y ai pas beaucoup réfléchi car il a été inventé dans le but de cette question. :) – ArtB

Questions connexes