46 votes

Blocs nommés pour limiter la portée des variables: bonne idée?

Pendant des années, j'ai été nommé à l'aide de blocs de limiter la portée des variables temporaires. Je n'ai jamais vu cela nulle part ailleurs, ce qui me fait me demander si c'est une mauvaise idée. Surtout depuis l'IDE Eclipse drapeaux de ces mises en garde par défaut.

J'ai utilisé à bon escient, je pense que, dans mon propre code. Mais depuis qu'il est non-idiomatique au point où de bons programmeurs vont méfiance quand ils voient ça, j'ai vraiment deux façons d'aller à partir d'ici:

  1. éviter de le faire, ou
  2. promouvoir, avec l'espoir qu'il deviendra un idiome.

Exemple (dans une plus grande méthode):

final Date nextTuesday;
initNextTuesday: {
    GregorianCalendar cal = new GregorianCalendar();
    ... // About 5-10 lines of setting the calendar fields
    nextTuesday = cal.getTime();
}

Ici, je suis en utilisant un GregorianCalendar juste pour initialiser une date, et je veux m'assurer de ne pas accidentellement le réutiliser.

Certaines personnes ont fait remarquer que vous n'avez pas réellement besoin de nom de la rue. Même si c'est vrai, un bloc brut semble encore plus comme un bug, car l'intention n'est pas claire. En outre, nommer quelque chose vous encourage à réfléchir sur l'intention de le bloquer. L'objectif ici est d'identifier les sections de code, de ne pas donner à chaque variable temporaire de son propre champ d'application.

Beaucoup de gens ont dit qu'il est préférable d'aller directement à de petites méthodes. Je suis d'accord que cela devrait être votre premier instinct. Cependant, il peut y avoir plusieurs facteurs atténuants:

  • Même à envisager un bloc nommé, le code doit être court, on-off code qui ne sera jamais appelé ailleurs.
  • Un bloc nommé est un moyen rapide d'organiser un grand méthode sans créer une méthode avec une douzaine de paramètres. Cela est particulièrement vrai quand une classe est dans le flux, et les entrées sont susceptibles de changer d'une version à l'autre.
  • Création d'une nouvelle méthode encourage la réutilisation, ce qui peut être mal avisé si les cas d'utilisation ne sont pas bien établies. Un bloc nommé est plus facile (psychologiquement, au moins) à jeter.
  • En particulier pour les tests unitaires, vous devrez peut-être définir une douzaine de différents objets sur des assertions, et ils sont suffisamment différentes pour que vous ne pouvez pas (encore) trouver un moyen de les réunir dans un petit nombre de méthodes, et vous ne pouvez pas penser à un moyen de les distinguer avec des noms qui ne sont pas d'un mile de long.

Avantages de l'utilisation de l'étendue nommée:

  1. Ne peut pas accidentellement réutiliser les variables temporaires
  2. Portée limitée donne garbage collector et compilateur JIT plus d'informations sur programmeur intention
  3. Nom de bloc fournit un commentaire sur un bloc de code, que je trouve plus lisible que les commentaires ouverts
  4. Facilite la refactorisation de code d'un grand méthode en peu de méthodes, ou vice-versa, puisque le bloc nommé est plus facile à séparer de code non structurées.

Inconvénients:

Pas idiomatiques: les programmeurs qui n'ont pas vu cette utilisation de l'nommé blocs (c'est à dire tout le monde sauf moi) supposons qu'elle est buggy, puisqu'ils ne peuvent pas trouver des références pour le nom du bloc. (Tout comme Eclipse n'.) Et obtenir quelque chose pour devenir idiomatique est une bataille difficile.

Il peut être utilisé comme une excuse pour de mauvaises habitudes de programmation, tels que:

  • Faire d'énormes monolithiques, les méthodes de plusieurs petites méthodes serait plus lisible.
  • Les couches d'indentation trop profond pour lire facilement.

Note: j'ai édité cette question largement, sur la base des réponses réfléchies. Merci!

26voto

Jon Skeet Points 692016

Je voudrais juste aller directement à la refactorisation dans des méthodes plus petites. Si une méthode est assez grand qu'il a besoin de casser comme ça, il faut vraiment briser en plusieurs méthodes si possible.

Bien que limiter le champ d’application soit agréable, ce n’est pas vraiment ce à quoi servent les blocs nommés. C'est unidiomatic, ce qui est rarement une bonne chose.

14voto

Scott Langham Points 17447

Si c'était mauvais, alors pourquoi est-ce une caractéristique de la langue! Il a un but, et vous l'avez trouvé.

J'écris souvent le code exactement comme dans votre exemple. Lorsque vous souhaitez initialiser une variable, et il y a un peu de calcul qui doit être fait de travailler sur ce que devrait être, et qui implique un couple de variables... alors vous ne voulez pas de ces variables traîner pour l'ensemble de la portée de votre fonction, puis un peu de place pour contenir l'initialisation de grandes œuvres.

Mini étendues de travail un moyen facile de briser le code dans 'les paragraphes'. Si vous partagez sur les méthodes que vous pouvez rendre le code plus difficile à naviguer quand ils n'obtiennent pas appelée à partir de n'importe où ailleurs et ont une série genre de l'ordre dans lequel elles doivent être exécutées.

C'est toujours un équilibre à trouver, mais si vous pensez que ça va être plus facile à maintenir et il ajoute de la valeur à un futur lecteur de votre code si sa en ligne, puis aller pour elle.

Il n'existe pas de règles strictes et rapides. J'ai un petit peu marre parfois avec des collègues pour qui trop de tout mettre dans sa propre méthode ou une classe ou d'un fichier, et cela devient un cauchemar pour naviguer. Il y a un bel équilibre quelque part!

10voto

John Nilsson Points 4650

J'utilise parfois des blocs anonymes pour isoler les éléments mutables nécessaires à la réalisation d'une chose immuable dont j'aurai besoin plus tard. Donc, au lieu d’avoir une étiquette, j’ai placé le plock sous la déclaration de variable immuable.

 final String example;
{
   final StringBuilder sb = new StringBuilder();
   for(int i = 0; i < 100; i++)
     sb.add(i);
   example = sb.toString();

}
 

Ensuite, lorsque je trouve un autre usage du bloc, ou pense simplement que c'est comme si je le déplaçais simplement vers une méthode;

5voto

anjanb Points 5579

C'est la 1ère fois que je vois quelqu'un d'autre à l'aide de blocs. ouf! Je pensais que j'étais le seul. Je sais que je n'ai pas l'inventer -- souvenu d'avoir lu quelque part-peut-être de mon précédent C++ monde.

Je n'utilise pas les étiquettes, et commenter ce que je fais.

Je ne suis pas d'accord avec tous les mecs qui sont en vous demandant l'extraire dans une méthode. La plupart des choses que nous ne dans ces blocs ne sont pas vraiment des blocs réutilisables. Il est logique dans un grand initialisation ET OUI, j'ai utilisé des blocs pour éviter de COPIER/COLLER des erreurs.

BR,
~Un

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X