À mon humble avis, il s'agit généralement d'une solution à éviter en grande partie pour le code de production car vous n'êtes généralement pas tenté de le faire, sauf dans les fonctions sporadiques qui effectuent des tâches disparates. J'ai tendance à le faire dans certains codes de scrap utilisés pour tester des choses, mais je ne trouve aucune tentation de le faire dans un code de production où j'ai réfléchi à l'avance à ce que chaque fonction devrait faire, car elle aura naturellement une très grande portée limitée par rapport à son état local.
Je n'ai jamais vraiment vu d'exemples de blocs anonymes utilisés de cette façon (sans condition, sans try
blocage de transaction, etc.) pour réduire le champ d'application de manière significative dans une fonction qui ne posait pas la question de savoir pourquoi cela ne pouvait pas. être divisée plus loin en fonctions plus simples à portée réduite si elle bénéficiait réellement d’un véritable point de vue SE des blocs anonymes. Il s’agit généralement d’un code éclectique qui utilise un tas de choses vaguement ou très peu liées pour lesquelles nous sommes le plus tentés d’atteindre cet objectif.
Par exemple, si vous essayez de faire cela pour réutiliser une variable nommée count
, cela suggère que vous comptez deux choses disparates. Si le nom de la variable doit être aussi court que possible count
, il me semble logique de le lier au contexte de la fonction, ce qui pourrait éventuellement ne compter que pour un type de chose. Vous pouvez ensuite consulter instantanément le nom de la fonction et / ou sa documentation, et voir count
immédiatement ce que cela signifie dans le contexte de ce que fait la fonction sans analyser tout le code. Je ne trouve pas souvent le bon argument pour qu'une fonction compte deux choses différentes réutilisant le même nom de variable de manière à rendre les étendues / blocs anonymes si attrayants par rapport aux alternatives. Cela ne veut pas dire que toutes les fonctions ne doivent compter qu’une seule chose. JE'L’avantage technique d’une fonction réutilisant le même nom de variable pour compter deux choses ou plus et utilisant des blocs anonymes pour limiter la portée de chaque compte individuel. Si la fonction est simple et claire, ce n’est pas la fin du monde d’avoir deux variables de dénomination nommées différemment, la première pouvant avoir un nombre de lignes de visibilité de l’application supérieur à ce qui est idéalement requis. De telles fonctions ne sont généralement pas la source d'erreurs manquant de tels blocs anonymes pour réduire encore la portée minimale de ses variables locales.
Pas une suggestion pour les méthodes superflues
Cela ne veut pas dire que vous créez de force des méthodes ou simplement pour réduire la portée. C'est sans doute tout aussi mauvais ou pire, et ce que je suggère, ne devrait pas faire davantage appel à un besoin de méthodes "d'assistance" privées maladroites qu'à un besoin de portées anonymes. C'est trop penser au code actuel et à la façon de réduire la portée des variables que de penser à la façon de résoudre le problème au niveau de l'interface de manière conceptuelle, de manière à obtenir une visibilité nette et courte des états de fonction locaux naturellement, sans imbrication profonde de blocs et plus de 6 niveaux d'indentation. Je suis d'accord avec Bruno sur le fait que vous pouvez entraver la lisibilité du code en insérant avec force 3 lignes de code dans une fonction, mais cela part du principe que vous faites évoluer les fonctions que vous créez en fonction de votre implémentation existante. plutôt que de concevoir les fonctions sans s'embrouiller dans les implémentations. Si vous le faites de cette manière, j'ai trouvé peu de besoin de blocs anonymes qui ne servent à rien, sauf à réduire la portée d'une variable dans une méthode donnée, sauf si vous essayez avec zèle de réduire la portée d'une variable de quelques lignes de code inoffensif où l'introduction exotique de ces blocs anonymes contribue sans doute autant à la surcharge intellectuelle qu'à la suppression.
Essayer de réduire encore les portées minimales
Si réduire la portée des variables locales au minimum absolu en valait la peine, le code devrait être largement accepté, comme ceci:
ImageIO.write(new Robot("borg").createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())), "png", new File(Db.getUserId(User.handle()).toString()));
... car cela entraîne une visibilité minimale de l'état en ne créant même pas de variables pour s'y référer en premier lieu. Je ne veux pas devenir dogmatique, mais je pense en fait que la solution pragmatique consiste à éviter les blocs anonymes autant que possible, tout comme à éviter la monstrueuse ligne de code ci-dessus, et si cela semble absolument nécessaire dans un contexte de production perspective de correction et de maintien des invariants dans une fonction, alors je pense vraiment que la façon dont vous organisez votre code en fonctions et la conception de vos interfaces mérite un nouvel examen. Naturellement, si votre méthode comporte 400 lignes et que la portée d'une variable est visible pour 300 lignes de code de plus que nécessaire, cela peut constituer un véritable problème d'ingénierie, mais ce n'est pas nécessairement un problème à résoudre avec des blocs anonymes.
Utiliser des blocs anonymes partout est exotique, pas idiomatique, et un code exotique risque d'être détesté par d'autres, si ce n'est vous-même, des années plus tard.
L'utilité pratique de la réduction de la portée
L’utilité ultime de la réduction du nombre de variables est de vous permettre d’obtenir une gestion de l’état correcte, de la conserver et de vous permettre de raisonner facilement sur ce que fait une partie donnée d’une base de code - pour pouvoir conserver des invariants conceptuels. Si la gestion de l'état local par une seule fonction est si complexe que vous devez réduire de manière décisive la portée avec un bloc anonyme dans du code qui n'est pas censé être finalisé et bon, là encore, c'est un signe pour moi que la fonction elle-même doit être réexaminée. . Si vous avez des difficultés à raisonner sur la gestion par l'état des variables dans une étendue de fonction locale, imaginez la difficulté de raisonner sur les variables privées accessibles à toutes les méthodes d'une classe entière. Nous ne pouvons pas utiliser de blocs anonymes pour réduire leur visibilité. Pour moi, il est utile de commencer par accepter que les variables tendent à avoir une portée légèrement plus large que celle dont elles auraient idéalement besoin dans de nombreuses langues, à condition que vous ne perdiez pas le contrôle de la situation au point que vous aurez du mal à maintenir les invariants. Ce n'est pas quelque chose à résoudre avec des blocs anonymes, je le vois comme accepter d'un point de vue pragmatique.