Examen Parcial Primavera 2011 (2011)

Apunte Español
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería de Sistemas de Telecomunicación - 1º curso
Asignatura Metodologia y Programacion Orientada a Objetos
Año del apunte 2011
Páginas 5
Fecha de subida 12/11/2014
Descargas 0
Subido por

Vista previa del texto

    EXAMEN PARCIAL DE METODOLOGIA DE PROGRAMACIÓ ORIENTADA A OBJECTES (MOO)  CURS 2010/2011. QUATRIMESTRE DE PRIMAVERA. 11 DE MAIG DE 2011.  La cadena de benzineres Guiruppa busca millorar el grau de satisfacció dels seus clients. Per una banda vol que vehicles dels seus usuaris omplin els seus dipòsits d'una manera segura i, de passada, vol guardar informació d'algunes característiques d'aquests vehicles. Per altra banda, vol controlar algunes activitats importants dels seus treballadors i de les seves benzineres. És per això que ens ha encarregat un programari que gestioni totes les seves estacions de servei, clients i vehicles.
Un cop finalitzades les etapes d’anàlisi i disseny del programari que ens han encarregat, hem arribat al següent diagrama de classes UML: Part de les activitats importants que Guiruppa vol controlar s’inclouran al mètode +caixa(), declarat a la interfície FerCaixa que tant la classe Treballador com Benzinera implementen.
En el cas de la classe Treballador, aquest mètode s’encarrega de sumar totes les instàncies Pagament que el treballador ha cobrat durant el seu torn. Fixeu-vos al diagrama de classes UML que la plantilla de la benzinera està composada de 3 treballadors: un torn de matí, un de tarda i un de nit. En el cas de la classe Benzinera, el mètode +caixa() s’encarrega de sumar les caixes parcials de la jornada.
A partir d’aquesta informació, així com del diagrama de classes mostrat, es demana: 1. (0,5 punts) FerCaixa és una interfície. No seria millor que fos una classe abstracta? Raona la teva resposta.
Essent una interfície, FerCaixa defineix un comportament (el mètode +caixa()) que hauran d’adoptar totes les classes que l’implementin. Observant el diagrama de classes UML que ens proporciona l’enunciat, les classes que implementen la interfície FerCaixa són Benzinera i Treballador, les quals pertanyen a famílies diferents i presenten característiques diferents. Això ens privaria d’utilitzar el concepte de classe abstracta amb aquests propòsits, ja que les classes abstractes prenen sentit en relacions d’herència, on les classes derivades, les que acabaran implementant els mètodes abstractes definits en la superclasse abstracta, comparteixen característiques i comportament amb aquesta.
2. (1 punt) Identifica al digrama UML un exemple d’abstracció, encapsulació, herència i polimorfisme. Justifica breument les teves eleccions.
Abstracció: qualsevol de les classes presents en el diagrama de classes UML és, en realitat, una abstracció d’un concepte del domini que pretenem simular.
Encapsulació: el principi d’encapsulació ens suggereix, generalment, la definició dels atributs de la classe amb visibilitat privada i els seus mètodes amb visibilitat pública, com per exemple en la classe Dipòsit.
Herència: les relacions d’herència representen relacions superclasse-subclasses, on les subclasses són especialitzacions de la superclasse (són tipus de). Per exemple, les subclasses Diesel, SensePlom95 i SensePlom98 són especialitzacions de la superclasse Sortidor.
Polimorfisme: el polimorfisme l’aconseguim definint mètodes en la superclasse (o interfície) que seran sobreescrits per totes les subclasses (o les classes que implementin la interfície). Els mètodes polimòrfics que podem trobar al diagrama de classes UML són +caixa():double i +utilitza(auto:Automobil, litres:double):void.
3. (0,5 punts) Quin sentit li trobes a la relació de dependència entre les classes Sortidor i Automobil? Raona la teva resposta.
S’estableix una relació de dependència entre dues classes quan una d’elles (classe dependent) utilitza l’altre (classe independent). Les relacions de dependència generalment representen una relació més dèbil que l’associació, on la classe dependent utilitza objectes de la classe independent com a paràmetres o variables locals en alguns dels seus mètodes, en comptes de fer-ho com a atributs de classe com en el cas de l’associació. En el diagrama de classes UML de l’enunciat podem observar com el mètode +utilitza() de la classe Sortidor requereix un paràmetre de tipus Automobil que li haurà de proporcionar l’objecte de tipus Client quan l’invoqui.
4. (3 punts) Escriu la part de codi de la definició de totes les classes del diagrama UML, començant des de public class. Inclou només la declaració dels atributs de les classes, fins i tot els que implementin relacions. Escriu també la definició sencera de la interfície FerCaixa.
public class Pagament{ private double total; } public class Treballador implements FerCaixa{ private List<Pagament> pagaments; } public class Benzinera implements FerCaixa{ private Treballador plantilla[]; private List<Sortidor> sortidors; } public class private private private } Client{ Treballador treballador; Automobil auto; Sortidor sortidor; public class Automobil{ private Diposit diposit; private Client client; } public class Diposit{ private double nivell; private double capacitat; } public abstract class Sortidor{ private int id; private double preuLitre; protected double litresServits, totalEuros; } public class Diesel extends Sortidor{ } public class SensePlom95 extends Sortidor{ } public class SensePlom98 extends Sortidor{ } public interface FerCaixa{ public double caixa(); } 5. (2 punts) Implementa el mètode +caixa(): double, tant de Treballador com de Benzinera.
public class Treballador implements FerCaixa{ public double caixa(){ double total = 0.0; Iterator<Pagament> it = this.pagaments.iterator(); while(it.hasNext()){ total = total + it.next().getTotal(); } return total; } } public class Benzinera implements FerCaixa{ public double caixa(){ double total = 0.0; for (int i = 0; i < this.plantilla.length; i++){ total = total + this.plantilla[i].caixa(); } return total; } } Per tal de gestionar l’operació d’omplir els dipòsits dels automòbils dels clients de les benzineres, hem definit les classes Sortidor, Automobil i Diposit. La classe Sortidor implementa el mètode +utilitza (auto: Automobil, litres: double): void, invocat des d’un objecte de la classe Client per tal d’intentar servir un nombre determinat de litres al seu Automobil auto.
Aquest mètode invoca a la vegada el mètode +servir (litres: double): double de la classe Automobil, el qual intentarà introduir el volum de combustible sol·licitat al dipòsit d’aquest, tot invocant el mètode omple (litres:double): double de la classe Diposit. L’estat del Diposit vé donat per dos atributs: capacitat, que indica la quantitat màxima de litres de benzina que hi caben, i nivell, que indica els litres de benzina que conté actualment l’objecte Diposit. Cal tenir en compte, però, que el dipòsit no pot omplir-se més enllà d'un llindar de seguretat imposat per la seva capacitat. En cas que es vulguin servir més litres dels que realment accepta el dipòsit, el mètode només permetrà arribar al llindar de seguretat. En qualsevol cas, el mètode +omple() retornarà el nombre de litres que s’han acabat introduint al dipòsit. A la vegada, aquesta informació serà retornada pel mètode +servir(),permetent al mètode +utilitza()actualitzar el comptador del sortidor amb la informació de litres servits i preu total correcte.
Per tal d’acomplir aquests propòsits, es demana: 6. (1 punt) Implementa el mètode +omple(litres: double): double de la classe Diposit. Considera un llindar de seguretat d’un 95% de la capacitat del dipòsit.
public class Diposit{ public double omple (double litres){ double capacitatRestant = 0.95*this.capacitat – this.nivell; if (litres <= capacitatRestant){ this.nivell = this.nivell + litres; return litres; }else{ this.nivell = 0.95*this.capacitat; return capacitatRestant; } } } 7. (0,5 punts) Implementa el mètode +servir (litres: double): double de la classe Automobil.
public class Automobil{ public double servir (double litres){ return this.diposit.omple(litres); } } 8. (1,5 punt) Implementa el mètode +utilitza (auto: Automobil, litres: double): void de la classe Sortidor. Recorda que aquest mètode ha d’actualitzar els atributs que calguin a l’objecte de la classe Sortidor un cop utilitzat, per tal d’assegurar un estat consistent de l’objecte.
public abstract class Sortidor{ public void utilitza(Automobil auto, double litres){ this.litresServits = this.litresServits + auto.servir(litres); this.totalEuros = this.litresServits*this.preuLitre; } } ...