Activitats
Proves unitàries
L’objectiu d’aquest exercici és treballar, en profunditat, les proves unitàries d’un algorisme desenvolupat en Java, validant el seu correcte funcionament.
A continuació, es mostra la classe CostPersonal que conté el mètode CostDelPersonal. Aquest mètode té com a funció el càlcul del cost final de cada treballador en funció dels valors dels paràmetres que els defineixen.
Concretament, si el tipus de treballador és director o subdirector, el cost final del treballador serà el corresponent a la seva nòmina. Però, si no és ni director ni subdirector, a la seva nòmina caldrà sumar-hi les hores extres que hagi fet per un valor de 20 unitats.
Donat el codi següent amb la implementació d’aquesta classe i aquest mètode, es demana crear les seves proves unitàries.
package IOC.desenvolupament; import java.util.ArrayList; import java.util.Collection; public class CostPersonal { static float CostDelPersonal(Treballador treballadors[]) { float costFinal = 0; Treballador treballador; for (int i = 0; i < treballadors.length; i++) { treballador = treballadors[i]; if ( treballador.getTipusTreballador() == Treballador.DIRECTOR || treballador.getTipusTreballador() == Treballador.SUBDIRECTOR) { costFinal += treballador.getNomina(); } else { costFinal += treballador.getNomina() + (treballador.getHoresExtres() * 20); } } return costFinal; } }
Refacció
L’objectiu d’aquest exercici és treballar el concepte de refacció i la seva aplicació.
A continuació, es mostra la classe CostPersonal, que conté el mètode CostDelPersonal. Aquest mètode té com a funció el càlcul del cost final de cada treballador en funció dels valors dels paràmetres que els defineixen. Concretament, si el tipus del treballador és director o subdirector, el cost final del treballador serà el corresponent a la seva nòmina. Però, si no és ni director ni subdirector, a la seva nòmina caldrà sumar-hi les hores extres que hagi fet per un valor de 20 unitats.
Donat el codi següent amb la implementació d’aquesta classe prèviament explicada, cal analitzar-lo i dir si es pot refactoritzar. En el cas que es pugui fer, es demana refactoritzar el codi i mostrar el codi resultant.
package IOC.desenvolupament; import java.util.ArrayList; import java.util.Collection; public class CostPersonal { static float CostDelPersonal(Treballador treballadors[]) { float costFinal = 0; Treballador treballador; for (int i = 0; i < treballadors.length; i++) { treballador = treballadors[i]; if ( treballador.getTipusTreballador() == Treballador.DIRECTOR|| treballador.getTipusTreballador() == Treballador.SUBDIRECTOR) { costFinal += treballador.getNomina(); } else { costFinal += treballador.getNomina() + (treballador.getHoresExtres() * 20); } } return costFinal; } }
Validació de la refacció
L’objectiu d’aquest exercici és fer un pas més enllà en l’aplicació de la refacció i la seva relació amb les proves unitàries.
Responeu a la qüestió següent: Com es pot validar que el codi al qual s’ha aplicat la refacció continua essent correcte?
Feu servir exemples per a demostrar la vostra resposta.
Refacció i Eclipse
L’objectiu de l’exercici consisteix a utilitzar les funcionalitats que ofereix l’IDE Eclipse a l’hora d’efectuar la refacció d’un codi.
El codi que es mostra a continuació calcula el cost d’una matrícula d’uns estudis de cicles formatius per a un determinat alumne.
El codi fa ús de dues classes:
- Assignatura, que té la informació de l’assignatura.
- Matrícula, que té la informació de l’alumne, així com les assignatures de les quals s’ha matriculat en el curs acadèmic.
Per tal de no dedicar temps addicional a altres accions no relacionades amb l’exercici, la informació de les assignatures i els alumnes es troba registrada temporalment en una col·lecció, no essent necessari configurar la connexió a una base de dades.
Es demana aplicar els patrons de refacció que es puguin aplicar sobre aquest codi, utilitzant l’IDE Eclipse.
package ioc.desenvolupament; public class Assignatura { public long id = 0; private String nom = ""; private int hores = 0; public int credits = 0; private boolean disponible = false; public Assignatura(long id, String nom, int hores, int credits, boolean disponible) { this.id = id; this.nom = nom; this.hores = hores; this.credits = credits; this.disponible = disponible; } }
package ioc.desenvolupament; import java.util.Collection; import java.util.ArrayList; import java.util.Iterator; public class Matricula { public long id = 0; private String nom = ""; private String cognoms = ""; private String dni = ""; private int curs = 0; private Collection assignatures; public Matricula(){} public Matricula(long id, String nom, String cognoms, String dni, int curs, Collection assignatures) { this.id = id; this.nom = nom; this.cognoms = cognoms; this.dni = dni; this.curs = curs; this.assignatures = assignatures; } public float costMatricula(){ float cost = 0; int credits = 0; for (Iterator iter = assignatures.iterator(); iter.hasNext();) { Assignatura element = (Assignatura) iter.next(); credits = credits + element.credits; } cost = credits * 15; return cost; } }
package ioc.test; import ioc.desenvolupament.*; import ioc.simulacio.dades.*; import java.util.Arrays; public class Test { public static void main(String[] args) { MatriculaDB matriculaDB = new MatriculaDB(); Matricula matricula = matriculaDB.getMatricula(2); System.out.print("Cost de la matricula " + matricula.costMatricula()); } }
Documentació i Eclipse
L’objectiu de l’exercici consisteix a utilitzar les funcionalitats que ofereix l’IDE Eclipse a l’hora de generar documentació de forma automàtica a partir d’un codi donat.
El codi que es mostra a continuació simula el funcionament d’una calculadora amb les seves funcions habituals.
Es demana:
- Modifica el codi de la calculadora perquè automàticament l’IDE d’Eclipse creï la documentació del codi.
- Genera el codi font.
import java.awt.BorderLayout; public class Calculadora { // Constants final int MAX_DIGITS = 5; final int MODE_ENTRADA = 0; final int MODE_RESULTAT = 1; //Variables int mode; int valor1; int valor2; String operacio; boolean inicialitza_resultat; private static Text text_resultat; public Calculadora(boolean gui) { //Inicialització de les variables. inicialitza(); if (gui==true) dibuixaCalculadora(); } private void dibuixaCalculadora() { Display display = Display.getDefault(); Shell shlCalculadora = new Shell(); shlCalculadora.setSize(259, 250); shlCalculadora.setText("Calculadora"); //------------------------------------------------- //Números //------------------------------------------------- //butò amb el número 0 Button button_0 = new Button(shlCalculadora, SWT.NONE); button_0.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(0); } }); button_0.setText("0"); button_0.setBounds(23, 163, 40, 33); //butò amb el número 1 Button button_1 = new Button(shlCalculadora, SWT.NONE); button_1.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(1); } }); button_1.setText("1"); button_1.setBounds(23, 124, 40, 33); //butò amb el número 2 Button button_2 = new Button(shlCalculadora, SWT.NONE); button_2.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(2); } }); button_2.setText("2"); button_2.setBounds(69, 124, 40, 33); //butò amb el número 3 Button button_3 = new Button(shlCalculadora, SWT.NONE); button_3.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(3); } }); button_3.setText("3"); button_3.setBounds(115, 124, 40, 33); //butò amb el número 4 Button button_4 = new Button(shlCalculadora, SWT.NONE); button_4.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(4); } }); button_4.setText("4"); button_4.setBounds(23, 85, 40, 33); //butò amb el número 5 Button button_5 = new Button(shlCalculadora, SWT.NONE); button_5.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(5); } }); button_5.setText("5"); button_5.setBounds(69, 85, 40, 33); //butò amb el número 6 Button button_6 = new Button(shlCalculadora, SWT.NONE); button_6.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(6); } }); button_6.setText("6"); button_6.setBounds(115, 85, 40, 33); //butò amb el número 7 Button button_7 = new Button(shlCalculadora, SWT.NONE); button_7.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(7); } }); button_7.setText("7"); button_7.setBounds(23, 46, 40, 33); //butò amb el número 8 Button button_8 = new Button(shlCalculadora, SWT.NONE); button_8.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(8); } }); button_8.setBounds(69, 46, 40, 33); button_8.setText("8"); //butò amb el número 9 Button button_9 = new Button(shlCalculadora, SWT.NONE); button_9.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { afageixNouDigit(9); } }); button_9.setText("9"); button_9.setBounds(115, 46, 40, 33); //------------------------------------------------- //Operacions //------------------------------------------------- //butò amb l'operació de divisió Button button_12 = new Button(shlCalculadora, SWT.NONE); button_12.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executarOperador("/"); } }); button_12.setText("/"); button_12.setBounds(178, 46, 40, 33); //butò amb l'operació de multiplicació Button button_13 = new Button(shlCalculadora, SWT.NONE); button_13.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executarOperador("*"); } }); button_13.setText("*"); button_13.setBounds(178, 85, 40, 33); //butò amb l'operació de suma Button button_14 = new Button(shlCalculadora, SWT.NONE); button_14.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executarOperador("+"); } }); button_14.setText("+"); button_14.setBounds(178, 124, 40, 33); //butò amb l'operació de resta Button button_15 = new Button(shlCalculadora, SWT.NONE); button_15.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executarOperador("-"); } }); button_15.setText("-"); button_15.setBounds(178, 163, 40, 33); //butò amb l'operació de igual Button button_11 = new Button(shlCalculadora, SWT.NONE); button_11.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { executarIgual(); } }); button_11.setText("="); button_11.setBounds(69, 163, 86, 33); //Text on es visualitza el resultat text_resultat = new Text(shlCalculadora, SWT.BORDER); text_resultat.setText("0"); text_resultat.setBounds(22, 19, 196, 21); shlCalculadora.open(); shlCalculadora.layout(); while (!shlCalculadora.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } public void inicialitza() { operacio = "null"; valor1 = 0; valor2 = 0; mode = MODE_ENTRADA; inicialitza_resultat = true; } public String getResultatString (){ return text_resultat.getText(); } public void setResultatString(String s){ text_resultat.setText(s); } public int getResultatInt() { String resultat = text_resultat.getText(); return Integer.parseInt(resultat); } public void afageixNouDigit(int digit){ if (inicialitza_resultat) setResultatString(""); String inputString = getResultatString(); if (inputString.indexOf("0") == 0){ inputString = inputString.substring(1); } if ((!inputString.equals("0") || digit > 0) && inputString.length() < MAX_DIGITS){ setResultatString(inputString + digit); } mode = MODE_ENTRADA; inicialitza_resultat = false; } public void executarOperador(String new_operacio) { int resultat; if (operacio.equals("null")) { resultat = getResultatInt(); valor1 = resultat; } else { valor2 = getResultatInt(); resultat = executarOperacio(); mostraResultat(resultat); valor1 = resultat; } inicialitza_resultat = true; operacio = new_operacio; } public void executarIgual(){ int resultat = 0; valor2 = getResultatInt(); resultat = executarOperacio(); mostraResultat(resultat); operacio = "null"; } public int executarOperacio() { int resultat = 0; if (operacio.equals("/")) { if (valor2 == 0) { JOptionPane.showMessageDialog(null, "No es pot dividir per cero", "Error", JOptionPane.ERROR_MESSAGE); operacio = "null"; valor1 = 0; mode = MODE_ENTRADA; inicialitza_resultat = true; } else resultat = valor1 / valor2; } if (operacio.equals("*")) resultat = valor1 * valor2; if (operacio.equals("-")) resultat = valor1 - valor2; if (operacio.equals("+")) resultat = valor1 + valor2; return resultat; } public void mostraResultat(int resultat){ setResultatString(Integer.toString(resultat)); valor1 = resultat; mode = MODE_RESULTAT; inicialitza_resultat = true; } public static void main(String args[]) { Calculadora calculadora = new Calculadora(true); } }



