Metode. Reutilizarea codului.

In aceasta lectie vom vorbi despre impartirea codului in metode, utilitatea acestora si modul in care le apelam.

In orice aplicatie din viata reala care face ceva util pentru a putea avea un control asupra codului acesta trebuie structurat in mai multe entitati logice. Una din principalele modalitati de structurare a codului o constituie metodele. Metodele sunt niste subprograme care sunt responsabile de o mica parte a unui program. Ele permit o intelegere mai usoara a codului, il fac mai flexibil si mai usor de modificat si, foarte important, faciliteaza reutilizarea codului, respectiv evitarea codului duplicat.

Ce este codul duplicat? Este o secventa de cod care se repeta in mai multe locuri. Poate fi complet identica sau aproape identica in functie de context. Un exemplu urmeaza mai jos.

Sa presupunem ca avem un program care trebuie sa calculeze si sa afiseze suma a 3 numere. Din ce am invatat pana acum un astfel de program ar putea arata asa:


public class Calcul {
  public static void main(String[] args) {
    // cele trei numere le initializam direct in program desi intr-un scenariu
    // real ar putea fi citite de exemplu de la tastatura
    int a = 5;
    int b = 7;
    int c = 10;    
    
    // calculam suma
    int suma = a + b + c;
    
    // si o afisam
    System.out.println(suma); 
  }
}

Pana aici totul pare in regula. Sa presupunem insa in continuare ca in cadrul aceluiasi proiect apare o cerinta suplimentara, respectiv avem nevoie si de afisarea mediei aritmetice a celor 3 numere in alt loc in cod. Codul ar putea arata astfel:


public class Calcul {
  public static void main(String[] args) {
    // cele trei numere le initializam direct in program desi intr-un scenariu
    // real ar putea fi citite de exemplu de la tastatura
    int a = 5;
    int b = 7;
    int c = 10;    
    
    // calculam suma
    int suma = a + b + c;
    
    // si o afisam
    System.out.println(suma);
  }
  
  public static void altaMetoda() {
    int a = 5;
    int b = 7;
    int c = 10;    
    
    // calculam media
    int media = (a + b + c) / 3;
    
    // si o afisam
    System.out.println(media);
  }
}

Daca ne uitam cu atentie la cele doua secvente de mai sus observam ca secventa a + b + c se repeta in ambele. Daca de exemplu in evolutia aplicatiei la un moment ajungem la concluzia ca in loc de suma avem nevoie de produsul celor 3 numere (chiar daca pentru medie nu are sens in realitate) atunci va trebui sa facem aceeasi modificare in doua locuri. Pare simplu dar avand cod duplicat la un proiect mare e posibil sa ajungem sa facem aceste modificari nu in 2 ci in 20 de locuri, ceea ce duce la pierdere de timp si bune sanse de a avea erori in program de exemplu daca uitam sa modificam intr-un loc sau modificam gresit.

Solutia o reprezinta extragerea codului duplicat intr-o metoda si folosirea ei in ambele locuri unde este necesar, adica:


public class Calcul {
  public static void main(String[] args) {
    // cele trei numere le initializam direct in program desi intr-un scenariu
    // real ar putea fi citite de exemplu de la tastatura
    int a = 5;
    int b = 7;
    int c = 10;    
    
    // calculam suma
    int suma = sum(a, b, c);
    
    // si o afisam
    System.out.println(suma); 
  }
  
  public static int sum(int a, int b, int c) {
    return a + b + c;
  }  
  
  public static void altaMetoda() {
    int a = 5;
    int b = 7;
    int c = 10;    
    
    // calculam media
    int media = sum(a, b, c) / 3;
    
    // si o afisam
    System.out.println(media);
  }
}

In situatia de mai sus avantajul nu este atat de evident deoarece codul duplicat este foarte simplu, dar imaginati-va ca pot exista situatii cu zeci de linii de cod duplicat iar in aceste situatii avantajul este mult mai evident. Adica metoda sum ar putea contine o logica mult mai complexa, dar modul in care este ea apelata ar arata exact la fel, o linie de cod.

Analizand metoda de mai jos, cuvantul cheie public semnifica faptul ca metoda va fi accesibila de oriunde din cod, static semnifica faptul ca metoda apartine clasei si nu unui obiect anume (vom reveni mai tarziu), int este tipul de data returnat de metoda. O metoda poate returna orice tip de date, iar in cazul in care nu se doreste returnarea unei valori in locul tipului de date returnat se va folosi cuvantul cheie void.


  public static int sum(int a, int b, int c) {
    return a + b + c;
  }  

Urmeaza apoi numele metodei sum si in paranteze rotunde, separati prin virgula, parametrii metodei, de forma (int a, int b, int c). Fiecare parametru are un tip si un nume. Corpul metodei se gasestei intre acolade si contine o singura linie return a + b + c. Cuvantul cheie se foloseste cand se doreste returnarea unei valori dintr-o metoda si este urmat de o expresie al carei tip trebuie sa fie compatibil cu tipul declarat in semnatura metodei. In acest caz a, b si c sunt int, suma lor va fi tot int ceea ce corespunde cu tipul declarat in semnatura metodei.

Testele urmatoare vor solicita crearea unei metode in loc de existenta unui program concret in metoda main. Puteti implementa si metoda main si puteti sa o folositi la testare, dar e obligatoriu sa aveti in cod metoda ceruta in enunt, cu numele, parametrii si tipul returnat specificate.

Este momentul sa arati ce ai invatat. Rezolva testul TR6 si testul TR7 pentru a-ti verifica cunostintele dobandite pana acum.