Question 1:
Est-ce à cause du retour de nouveau StreamReader (nom de fichier); à l'intérieur de la boucle for? ou le fait que vous n'avez pas besoin d'une boucle for dans ce cas?
Le streamreader n'a rien à voir avec cela. L'anti-modèle émerge en raison d'un conflit d'intention clair entre le foreach
et le if
:
Quel est le but du foreach
?
Je suppose que votre réponse sera quelque chose comme: "Je veux exécuter à plusieurs reprises un morceau de code particulier"
Combien de fichiers prévoyez-vous de traiter?
Étant donné que vous ne pouvez avoir qu'un seul nom de fichier spécifique (y compris l'extension) dans un dossier particulier, cela prouve que votre code est destiné à trouver un fichier applicable.
Cela est également confirmé par le fait que vous renvoyez une valeur immédiatement. Vous ne vous souciez pas réellement d'un deuxième match, même s'il devait exister.
Il y a des situations où ce n'est pas un anti-modèle.
- Si vous regardez également dans les sous-répertoires (
Directory.GetFiles(".", SearchOption.AllDirectories)
), il est possible de trouver plus d'un fichier avec le même nom de fichier (y compris l'extension)
- Si vous recherchez des correspondances de nom de fichier partielles (par exemple, chaque fichier dont le nom commence par
"Test_"
, ou chaque "*.zip"
fichier.
Notez que ces deux cas nécessitent que vous traitez réellement plusieurs correspondances et que vous ne renvoyiez donc pas de valeur immédiatement.
Question 2:
Pour corriger le deuxième exemple, voulez-vous le réécrire sans l'instruction if, et à la place entourer le StreamReader d'un bloc try-catch, et s'il lève une FileNotFoundException, vous le gérez en conséquence dans le bloc catch?
Les exceptions coûtent cher. Ils ne doivent jamais être utilisés à la place d'une logique de flux appropriée. Les exceptions sont, comme leur nom l'indique, des circonstances exceptionnelles .
Pour cette raison, vous ne devez pas supprimer le fichier if
.
Selon cette réponse sur SoftwareEngineering.SE :
Généralement, l'utilisation d'exceptions pour le flux de contrôle est un anti-modèle, avec des toux exceptionnelles spécifiques à la situation et à la langue.
En résumé, pourquoi, généralement, c'est un anti-modèle:
- Les exceptions sont, par essence, des instructions GOTO sophistiquées
- La programmation avec des exceptions conduit donc à un code plus difficile à lire et à comprendre
- La plupart des langues ont des structures de contrôle existantes conçues pour résoudre vos problèmes sans utiliser d'exceptions
- Les arguments en faveur de l'efficacité ont tendance à être sans objet pour les compilateurs modernes, qui ont tendance à optimiser en supposant que les exceptions ne sont pas utilisées pour le flux de contrôle.
Lisez la discussion sur le wiki de Ward pour des informations beaucoup plus approfondies.
Que vous ayez besoin d'envelopper dans un essai / capture, cela dépend fortement de votre situation:
- Quelle est la probabilité que vous rencontriez une condition de concurrence?
- Êtes-vous réellement capable de gérer cette situation, ou voulez-vous que ce problème se propage à l'utilisateur parce que vous ne savez pas comment le gérer.
Il ne s'agit jamais de "toujours l'utiliser". Pour prouver mon point:
Des études distinctes ont prouvé que vous êtes moins susceptible de vous blesser lorsque vous portez un casque de sécurité, des lunettes de sécurité et des gilets pare-balles.
Alors pourquoi ne portons-nous pas tous cet équipement de sécurité en tout temps?
La réponse est simple car il y a des inconvénients à les porter:
- Ça coûte de l'argent
- Cela rend votre mouvement plus encombrant
- Il peut être assez chaud de le porter.
Nous arrivons maintenant quelque part: il y a des avantages et des inconvénients . En d'autres termes, il est logique de porter cet équipement dans les cas où les avantages l' emportent sur les inconvénients.
- Les travailleurs de la construction sont beaucoup plus susceptibles de subir une blessure au cours de leur travail. Ils bénéficient d'un casque de sécurité.
- Les employés de bureau, en revanche, ont beaucoup moins de chances de se blesser. Les casques de sécurité n'en valent pas la peine.
- Un membre de l'équipe SWAT est beaucoup plus susceptible de se faire tirer dessus, qu'un employé de bureau.
Devriez-vous terminer l'appel dans un essai / capture? Cela dépend beaucoup de la question de savoir si les avantages de le faire l'emportent sur le coût de sa mise en œuvre.
Notez que d'autres peuvent faire valoir qu'il ne faut que quelques touches pour l'envelopper, donc cela devrait évidemment être fait. Mais ce n'est pas tout l'argument:
- Vous devez décider quoi faire une fois que vous avez saisi l'exception.
- S'il y a beaucoup d'appels différents à différents fichiers partout dans la base de code, décider d'en encapsuler un dans un try / catch signifie généralement que vous devez encapsuler tous ces cas. Cela peut avoir un effet dramatique sur la quantité d'efforts nécessaires pour le mettre en œuvre.
- Il est parfaitement possible que vous souhaitiez intentionnellement ne pas gérer d'exception.
- Notez que votre application devra gérer l'exception à un moment donné, mais ce n'est pas nécessairement immédiatement après le déclenchement de l'exception.
Donc, c'est à toi de choisir. Y a-t-il un avantage à le faire? Pensez-vous que cela améliore l'application, plus que le coût des efforts de mise en œuvre?
Mise à jour - D'un commentaire que j'ai écrit à l'autre réponse, car je pense que c'est une considération pertinente pour vous aussi:
Cela dépend beaucoup du contexte environnant.
- Si l'ouverture du streamreader est précédée de
if(!File.Exists) File.Create()
, alors l'absence du fichier lors de l'ouverture du streamreader est en effet exceptionnelle .
- Si le nom de fichier a été sélectionné dans une liste de fichiers existants, son absence soudaine est à nouveau exceptionnelle .
- Si vous travaillez avec une chaîne que vous n'avez pas encore testée par rapport au répertoire; alors l'absence du dossier est une issue parfaitement logique, et donc pas exceptionnelle .