Diseño y Programación Orientada a Objetos Conferencia # 11 Caso de estudio Integrador: Acueducto TEMA # 3: Herencia y Polimorfismo Facultad Ing. Informática ISPJAE
Contenidos que se integran Encapsulamiento Herencia Polimorfismo Clases genéricas
En el Acueducto de Albear se desea automatizar el control de los tanques de agua que abastecen del preciado líquido a la Capital. Para almacenar agua existen un conjunto de tanques, que pueden tener forma cilíndrica o de cubo con base rectangular. De cada tanque se conoce: identificación, dimensiones y el volumen de agua almacenado.
Cada tanque tiene un conjunto de válvulas y cada una de ellas alimenta a un municipio. Las válvulas se cierran o abren en dependencia de las necesidades de abastecimiento del municipio y se guarda la fecha en que se realiza esta acción.
1.Diseñe las clases necesarias para modelar la situación anterior usando UML. 2. Implemente las clases modeladas en Java. 3. Implemente las funciones necesarias para satisfacer los siguientes requerimientos funcionales :
Requerimientos funcionales Conocer la cantidad de m3 disponibles actualmente para la región. Abrir las válvulas que alimentan a un municipio si los tanques donde ellas se encuentran están por encima de un % dado de su capacidad. Conocer por municipios la cantidad de válvulas de tanques cilíndricos que están vertiendo
Requerimientos funcionales Cerrar las válvulas de un tanque si el municipio que alimentan recibe agua de otros tanques, y si el tanque se encuentra por debajo del 25% de su capacidad. Conocer los municipios que están siendo abastecidos. Conocer el tanque que lleva más tiempo vertiendo hacia un municipio dado.
Diseño de clases
Tank CilindricalTank - float radius +float baseArea() CubeTank String id float height float actualVolume +float baseArea() +float Volume() CilindricalTank - float radius +float baseArea() CubeTank float sideA float sideB +float baseArea()
Acueduct Municipality Valve Tank String name int population Date date String id float height float actualVolume + float baseArea() +float Volume() Acueduct 0..* 1 1 1 0..* abastece 0..* Municipality String name int population Valve Date date boolean isOpen municiplaity 0..* 1 alimenta
Implementación en Java
public abstract class Tank { private String ID; protected float height; private ArrayList <Valve> valves; protected float actualVolumen; public Tank (String id, float height, float actualVolumen) { ID = id; this.height = height; this.actualVolumen = actualVolumen; this.valves = new ArrayList<Valve>(); } …
public abstract class Tank { … public float volume() { return baseArea()*height; } public abstract float baseArea(); public void addValve(Municipality municipality, Date date){ Valve v= new Valve(municipality,date); valves.add(v); } …
public class CilindricalTank extends Tank { private float radius; public CilindricalTank(String id, float height, float actualVolumen, float radius) { super(id, height, actualVolumen); this.radius = radius; } public float baseArea() { return Math.PI * Math.pow(this.radius, 2);
public class CubeTank extends Tank { private float sideA; private float sideB; public CubeTank(String id, float height, float actualVolumen, float sideA, float sideB) { super(id, height, actualVolumen); this.sideA = sideA; this.sideB = sideB; }
public class CubeTank extends Tank { … public float baseArea() { return sideA*sideB; }
public class Valve { private Municipality municipality; private boolean isOpen; private Date date; public Valve(Municipality municipality, Date date) { this.municipality = municipality; this.date = date; this.isOpen = false; }
public class TankCollection { private ArrayList<Tank> tanks; public TankCollection() { this.tanks = new ArrayList<Tank>(); } public boolean addTank(Tank tank) { if (find(tank.getID()) == -1) { tanks.add(tank); return true; } else return false; }
public class TankCollection { … public boolean addValveTank(String id, Municipality municipality, Date date){ int p= find(id); if (p != -1) { tanks.get(p).addValve(municipality, date); return true; } else return false;
public class Municipality { private String name; private int population; public Municipality(String name, int population) { this.name = name; this.population = population; } // métodos set y get
public class MunicipalityCollection { private ArrayList<Municipality> municipalities; public MunicipalityCollection() { this.municipalities = new ArrayList<Municipality>(); } public Municipality find(String name) { …} public boolean addMunicipality(Municipality municipality) { … } public boolean delete(String name) {…}
public class Acueduct { private TankCollection tankColl; private MunicipalityCollection munColl; public Acueduct() { this.tankColl= new TankCollection(); this.munColl= new MunicipalityCollection(); }
public class Acueduct { … public boolean addCilindricalTank(String id, float height, float actualVolumen, float radius){ CilindricalTank tank = new CilindricalTank(id, height, actualVolumen, radius)); return tankColl.addTank(tank} }
public class Acueduct { public boolean addCubeTank(String id, … public boolean addCubeTank(String id, float height, float actualVolumen, float sideA, float sideB) { return tankCollection.addTank(new CubeTank(id, height, actualVolumen, sideA, sideB)); }
public boolean addValveTank(String id, Municipality municipality) { public class Acueduct { … public boolean addValveTank(String id, Municipality municipality) { return tankCollection.addValveTank(id, municipality); }
Solución de los incisos utilizando Patrón Experto. a. Conocer la cantidad de m3 disponibles actualmente para la región. Clases involucradas: - Tank : devolver el volumen actual - TankCollection : devolver la capacidad total (sumando el volumen actual de todos los tanques) - Acueduct: devolver la capacidad total invocando a la instancia de TankCollection.
Acueduct: invoca al método correspondiente a través de la instancia b. Abrir las válvulas que alimentan a un municipio si los tanques donde ellas se encuentran están por encima de un % dado de su capacidad. Clases involucradas: - Tank: verifica si su volumen actual está por encima del % dado y abre las válvulas que abastecen al municipio. TankCollection: manda a ejecutar la acción anterior para todos los tanques. Acueduct: invoca al método correspondiente a través de la instancia
Estudio Independiente - Implementar los incisos restantes.