mars 10, 2021

Portée des variables en Java

Réduire la portée

La phrase suivante Vous devez le brûler sur votre tête à partir de ce moment:

Toutes variable doivent être déclarées dans la portée la plus courte possible.

Quand une variable est déclarée plus étendue. que nécessaire, ce n’est qu’une question de temps que nous utilisons cette variable de manière incorrecte, ce qui provoque la confusion et nous avons invité à introduire des bugs (si la mauvaise portée n’est pas en soi et un bug …). Nous allons l’illustrer avec un exemple:

public class MiClase {int contarUsuariosPorNombreIncompleto(String fragmentoNombreUsuario, String nombreUsuarios) {boolean encontrado = false;int totalEncontrados = 0;for (Usuario nombreUsuarioActual : nombreUsuarios) {if (nombreUsuarioActual.contains(fragmentoNombreUsuario)) {encontrado = true;}if (encontrado) {totalEncontrados++;}}return totalEncontrados;}public static void main(String args) {String fragmentoNombreUsuario = "Michael";String nombreUsuarios = {"Jhon Doole", "Michael Fletcher", "James 'Jimmy X' Donald"};int resultado = new MiClase().contarUsuariosPorNombreIncompleto(fragmentoNombreUsuario, nombreUsuarios);System.out.println("Total resultados: " + resultado);}}

Lorsque vous exécutez la classe précédente, nous pouvons voir la sortie suivante par console:

Qu’est-il arrivé? Un seul des utilisateurs a la chaîne de Michael de son nom, mais nous sommes informés qu’il y a deux noms d’utilisateur correspondants. Nous couvrons pratiquement l’exécution de l’appel à :

  1. Début de la première itération:
    • trouvé est false
    • totalement trouvé 0
  2. fin de la première itération:
    • trouvé est false
    • totalement trouvé 0
  3. Démarrage de la deuxième itération:
    • trouvé est false
    • totalement trouvé il est 0
  4. fin de la deuxième itération:
    • trouvé est trouvé true
    • totalement trouvé 1
  5. début de la troisième et dernière itération:
    • trouvé, il est true (mais devrait être false)
    • totalement trouvé 1
  6. fin de troisième et dernière itération:
    • trouvée est true
    • totalement trouvé 2

sans aller de valeur que l’utilisation de Deux blocs if pour la logique de notre problème (trouver un utilisateur pour un fragment de votre nom) est totalement inutile, résulte de la variable encontrado Celui qui détermine que nous augmentons le compteur totalEncontrados. Le problème est que la variable encontrado doit être redémarrée sur False au début (ou à la fin) de chaque itération ou autrement au moment où nous trouvons une coïncidence que le reste des itérations donnera une coïncidence. FAUX positif:

public class MiClase {int contarUsuariosPorNombreIncompleto(String fragmentoNombreUsuario, String nombreUsuarios) {boolean encontrado = false;int totalEncontrados = 0;for (Usuario nombreUsuarioActual : nombreUsuarios) {if (nombreUsuarioActual.contains(fragmentoNombreUsuario)) {encontrado = true;}if (encontrado) {totalEncontrados++;}encontrado = false;}return totalEncontrados;}// ...}

Maintenant, lors de l’exécution de notre classe, nous obtenons le résultat attendu pour les données que nous avons fournies:

Total resultados: 1

Eh bien, nous avons déjà résolu notre bogue odieux. Le moment est venu d’arrêter et d’évaluer la situation. Si vous envisagez de quitter le code tel qu’il est que: vous êtes inexpérimenté (pardonnable) ou si vous êtes pressé (pas dedommable) ou ne vous souciez pas (punissable).

oublie quel genre de programmateur Vous voulez être, nous allons continuer. Ne pensez-vous pas que nous faisons une petite utilisation torsadée de la variable encontrado ?:

  • Nous le déclarons comme une variable de bloc (portée locale) . ..
  • … à l’intérieur de la méthode
  • … Mais nous l’utilisons juste à l’intérieur du bloc for (une portée locale plus concrète)

Vous souvenez-vous de cette phrase que vous devez enregistrer pour tirer sur votre tête?

toute variable doit être déclarée dans la plus petite zone possible.

Notre variable est déclarée dans une zone supérieure à celle dans laquelle il est utilisé, et par nous devons réduire sa portée:

public class MiClase {int contarUsuariosPorNombreIncompleto(String fragmentoNombreUsuario, String nombreUsuarios) {int totalEncontrados = 0;for (Usuario nombreUsuarioActual : nombreUsuarios) {boolean encontrado = false;if (nombreUsuarioActual.contains(fragmentoNombreUsuario)) {encontrado = true;}if (encontrado) {totalEncontrados++;}}return totalEncontrados;}// ...}

Maintenant que la variable est dans sa portée appropriée, le code d’origine est exempt d’erreurs et nous avons Réduit l’utilisation de la variable de trois à deux places, ce qui signifie un code de nettoyage. Pourrions-nous réduire davantage la portée de la variable booléenne? Dans ce cas particulier, oui, l’éliminait complètement (il n’y a pas de variable, il n’y a pas de portée):

public class MiClase {int buscarNumeroUsuarios(String nombreParcialUsuarioBusqueda, String nombreUsuarios) {int totalEncontrados = 0;for (Usuario nombreUsuarioActual : nombreUsuarios) {if (nombreUsuarioActual.contains(nombreParcialUsuarioBusqueda)) {totalEncontrados++;}}return totalEncontrados;}// ...}

Notre logique commerciale est tout à fait simple. L’enlèvement de la variable encontrado n’est pas techniquement une réduction de la portée, sinon un refactoring (amélioration du code).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *