martie 10, 2021

Domeniul de aplicare al variabilelor în Java

Reducerea domeniului de aplicare

Următoarea frază pe care trebuie să o arzi peste capul dvs. din acest moment:

Toate variabilele trebuie declarate în cel mai scurt domeniu posibil.

Atunci când o variabilă este declarată cu un domeniu mai extins Datorie, este doar o chestiune de timp pe care o folosim incorect a acea variabilă, provocând confuzie și ne-a invitat să introducem bug-urile (dacă scopul greșit nu este în sine și un bug …). O vom ilustra cu un exemplu:

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);}}

La executarea clasei anterioare, putem vedea următoarea ieșire de către consola:

ce sa întâmplat? Doar unul dintre utilizatori are lanțul Michael în numele său, dar suntem informați că există două nume de utilizator potrivite. Acoperim practic execuția apelului la :

  1. începutul primei iterații:
    • găsit este false
  2. sfârșitul primei iterații:
    • găsit este false
  3. Pornirea a doua iterație:
    • găsit este false
  4. sfârșitul celei de-a doua iterație:
    • găsit este true
  5. Începerea celei de-a treia și ultima iterație:
    • a găsit-o este true (dar ar trebui să fie false)
    • total găsit 1
  6. sfârșitul celei de-a treia și ultima iterație:
    • găsite este true
    • total găsit 2

fără a ajunge la valoare decât utilizarea lui Două blocuri if Pentru logica problemei noastre (Găsiți un utilizator pentru un fragment al numelui dvs.) este total inutil, este rezultatul variabilei iv ID = „065F0FE437”

cel care determină că creștem contorul totalEncontrados. Problema este că variabila encontrado ar trebui să fie repornit la FALSE la începutul (sau la sfârșitul) fiecărei iterații sau altfel în momentul în care găsim o coincidență pe care le va da restul iterațiilor Fals pozitiv:

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;}// ...}

Acum, atunci când rulați din nou clasa noastră, obținem rezultatul așteptat pentru datele pe care le-am furnizat:

Total resultados: 1

Ei bine, am rezolvat deja bug-ul nostru odios. Acum este momentul să opriți și să evaluați situația. Dacă vă gândiți să părăsiți codul așa cum este: Sunteți neexperimentați (iertați) sau vă grăbiți (nu sunteți iertați) sau pur și simplu nu vă îngrijiți (pedepsirea)

uitați ce fel de programator Vrei să fii, vom continua. Nu credeți că facem o mică utilizare a variabilei ?: „Le declarăm ca o variabilă bloc (domeniul local) . ..

  • … în cadrul metodei
  • … dar o folosim doar în interiorul blocului for (un domeniu de aplicare mai concret)
  • Îți amintești acea frază pe care ar trebui să o înregistrezi pentru a trage pe cap?

    Orice variabilă trebuie declarată în zona cea mai mică.

    Variabila noastră este declarată într-o zonă mai mare decât cea în care este folosit și de noi trebuie să reducem domeniul său de aplicare:

    divid id = „82d5ee3309″>

    că variabila este în scopul său adecvat, codul original este gratuit de erori și avem a redus utilizarea variabilei de trei până la două locuri, ceea ce înseamnă codul mai curat. Putem reduce în continuare domeniul de aplicare al variabilei booleene? În acest caz particular Da, eliminând-o complet (nu există variabilă, nu există niciun domeniu):

    divid id = „402C43971c”>

    Acum, logica noastră de afaceri este destul de simplă de înțeles. Îndepărtarea variabilei encontrado nu este o reducere tehnică a domeniului de aplicare, dacă nu o refactorizare (îmbunătățire a codului).

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *