Annexos

Millores en el codi mitjançant arrays

Ser capaç de generar codi eficient i simple és una qüestió de pràctica i experiència. En realitat, no hi ha una fórmula general aplicable a qualsevol cas, sinó una recopilació de petits trucs o tècniques. En aquest annex veureu una d’aquestes tècniques: com és possible simplificar enormement algunes estructures de selecció fent un ús intel·ligent d’arrays auxiliars.

Un cas en què es poden usar estructures de selecció és aquell en el qual realment el que es vol és fer una traducció des d’un número a un altre valor resultant (un altre enter, una cadena de text, etc.). Un exemple d’aquesta situació és establir a partir del número d’un mes quin és el seu nom en format cadena de text o quants dies té. Aquest tasca, de fet, és la que s’ha dut a terme en els mètodes mostrarData i incrementarData. Si el conjunt de valors a controlar és gran, el codi també es fa llarg, ja que calen tantes branques al codi com resultats possibles.

Una manera de simplificar el codi quan es dóna aquest fet és disposar de la taula de traducció en forma d’array, declarat com una constant dins el programa i inicialitzat amb valors concrets. En aquest cas, l’índex de cada posició es correspondrà al valor que es voldria controlar a l’estructura de selecció, i el valor emmagatzemat a cada posició serà el resultat desitjat.

Com sempre, la millor manera de veure-ho és amb un exemple. Tot seguit es mostra com simplificar el mètode incrementarData() usant aquesta tècnica. Fixeu-vos que la sentència id/else if/else desapareix totalment, i el codi s’escurça unes quantes línies.

  1. //Constant amb l'array que conté la taula de traducció de noms de mesos
  2. private static final int[] diesDelMes =
  3. {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 20, 31};
  4. ...
  5.  
  6. public void incrementarData() {
  7. //Quants dies té aquest mes?
  8. //Ja no cal una sentència if/else if/else
  9. //L'array diesDelMes us fa de taula de traducció
  10. int diesAquestMes = diesDelMes[mes - 1];
  11. dia = dia + 7;
  12. //Hem passat de mes?
  13. if (dia > diesAquestMes) {
  14. dia = dia - diesAquestMes;
  15. mes++;
  16. //Hem passat d'any?
  17. if (mes > 12) {
  18. mes = 1;
  19. }
  20. }
  21. }

Aquesta tècnica també és aplicable per traduir des d’un enter a una cadena de text. Observeu com se simplifica enormement el mètode mostrarData, ja que desapareix la sentència switch. Ara bé, alerta. Tot i que aquest mètode ara es veu enormement simplificat, no seria bona idea eliminar-lo, ja que és invocat des de més d’un lloc diferent.

  1. //Constant amb l'array que conté la taula de traducció de dies del mes
  2. private static final String[] nomDelMes =
  3. {"Gener", "Febrer", "Març", "Abril", "Maig", "Juny",
  4. "Juliol", "Agost", "Setembre", "Octubre", "Novembre",
  5. "Desembre"};
  6. ...
  7.  
  8. public void mostrarData() {
  9. System.out.print(dia + " de " + nomDelMes[mes - 1]);
  10. }

Reemplaceu el codi original per aquest i comproveu que el programa continua funcionant.

Anar a la pàgina anterior:
Exercicis d'autoavaluació
Anar a la pàgina següent:
Parametrització de mètodes