3. El Caso de Estudio
En este caso de estudio queremos construir un programa que permita a una persona calcular el valor de los impuestos que debe pagar por un automóvil. Para esto, el programa debe tener en cuenta el valor del vehículo y los descuentos que contempla la ley.
Un vehículo se caracteriza por una marca (por ejemplo, Peugeot, Mazda), una línea (por ejemplo, 206, 307, Allegro), un modelo, que corresponde al año de fabricación (por ejemplo, 2016, 2017), y un precio.
Para calcular el valor de los impuestos se establecen ciertos rangos, donde cada uno tiene asociado un porcentaje que se aplica sobre el valor del vehículo. Por ejemplo, si se tiene que los vehículos con precio entre 0 y 30 millones deben pagar el 1,5% del valor del vehículo como impuesto anual, un automóvil avaluado en 10 millones debe pagar $150.000 al año. La siguiente tabla resume el porcentaje de impuestos para los cuatro rangos de valores en que han sido divididos los automóviles.
- Entre 0 y 30 millones, pagan el 1,5% de impuesto.
- Más de 30 millones y hasta 70 millones, pagan el 2,0% de impuesto.
- Más de 70 millones y hasta 200 millones, pagan el 2,5% de impuesto.
- Más de 200 millones, pagan el 4% de impuesto.
Esta tabla se debe poder cambiar sin necesidad de modificar el programa, lo cual implica que pueden aparecer nuevos rangos, modificarse los límites o cambiar los porcentajes.
En el caso que queremos trabajar, están definidos tres tipos de descuentos:
- Descuento por pronto pago (10% de descuento en el valor del impuesto si se paga antes del 31 de marzo).
- Descuento para vehículos de servicio público ($50.000 de descuento en el impuesto anual).
- Descuento por traslado del registro de un automóvil a una nueva ciudad (5% de descuento en el pago).
Estos descuentos se aplican en el orden en el que acabamos de presentarlos. Por ejemplo, si el vehículo debe pagar $150.000 de impuestos, pero tiene derecho a los tres descuentos, debería pagar $80.750, calculados de la siguiente manera:
- 150.000 – 15.000 = 135.000 (Primer descuento: 150.000 * 10% = 15.000 )
- 135.000 – 50.000 = 85.000 (Segundo descuento: 50.000)
- 85.000 – 4.250 = 80.750 (Tercer descuento: 85.000 * 5% = 4.250)
El diseño de la interfaz de la aplicación (figura 5.2) trata de organizar los elementos del problema en zonas de trabajo fáciles de entender y utilizar por el usuario. Como se puede ver, después de la la imagen con el nombre de la aplicación hay una zona que tiene como objetivo mostrar la información sobre un vehículo y permite navegar por los vehículos existentes en la aplicación. Después, hay una zona que permite buscar un vehículo por línea o marca y encontrar el vehículo más caro. Luego hay una zona que permite seleccionar los descuentos que se desean aplicar. Finalmente, en la parte inferior se tiene una zona donde se ofrece la opción de calcular el impuesto a pagar por el vehículo actual, así como 2 opciones adicionales.
Fig. 5.2 Diseño de la interfaz de usuario del caso de estudio |
---|
- La ventana del programa está dividida en cinco zonas: en la primera está la imagen con el título, en la segunda los datos del vehículo, en la tercera las opciones de búsqueda, en la cuarta la selección de descuentos, y en la quinta las opciones que provee la aplicación.
- El botón << permite visualizar el primer vehículo de la lista.
- El botón < permite visualizar el vehículo anterior.
- El boton > permite visualizar el vehículo siguiente.
- El botón >> permite visualizar el último vehículo de la lista.
- El botón Buscar por línea permite visualizar el primer vehículo que encuentre con la línea ingresada por el usuario.
- El botón Buscar por marca permite visualizar el primer vehículo que encuentre con la marca ingresada por el usuario.
- El botón Buscar vehículo más caro permite visualizar el vehículo con mayor valor.
- En la zona de descuentos, el usuario debe seleccionar los descuentos que quiere aplicar.
- El botón calcular muestra un mensaje con el valor total que debe pagar el usuario por el vehículo mostrado actualmente, incluyendo los descuentos seleccionados.
- Los botones Opción 1 y Opción 2 todavía no tienen una funcionalidad asignada.
- Fíjese que cada zona (menos la primera) tiene un borde y un título.
Si el usuario intenta hacer hacer una búsqueda sin haber dado la información necesaria, el programa debe informarle del problema utilizando una ventana de diálogo, como se muestra en la figura 5.3.
Fig. 5.3 Mensaje de la interfaz al usuario |
---|
Si el usuario trata de navegar una consulta sobre un vehículo cuya información no está registrada en el programa, se debe presentar la advertencia que aparece en la figura 5.4.
Fig. 5.4 – Mensaje de la interfaz al usuario |
---|
Cuando el usuario selecciona la opción calcular, se debe presentar un mensaje con el valor a pagar, como se muestra en la figura 5.5.
Fig. 5.5 – Mensaje de la interfaz al usuario |
---|
3.1. Comprensión de los requerimientos
A partir de la descripción del caso de estudio, podemos identificar al menos seis requerimientos funcionales:
Navegar entre vehículos.
Buscar un vehículo por línea.
Buscar un vehículo por marca.
Buscar el vehículo más caro.
Calcular el impuesto de un carro.
Visualizar la información de un vehículo.
Tarea 1
Objetivo: Entender los requerimientos funcionales del caso de estudio.
Lea detenidamente el enunciado del caso de estudio, identifique los seis requerimientos funcionales y complete su documentación.
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
Nombre | |
---|---|
Resumen | |
Entradas | |
Resultado |
3.2. Comprensión del Mundo del Problema
En el modelo conceptual aparecen tres entidades con la estructura que se muestra en la figura 5.6. Dichas entidades son:
- El calculador de impuestos (clase CalculadorImpuestos).
- El vehículo (claseVehiculo).
- Un rango de precios al que se le asocia un porcentaje de impuestos (clase RangoImpuesto).
Fig. 5.6 Diagrama de clases del caso de estudio |
---|
Tarea 2
Objetivo: Entender la estructura y las entidades del modelo conceptual del caso de estudio.
Lea de nuevo el enunciado del problema y estudie el diagrama de clases de UML que aparece en la figura 5.6. Para cada clase describa las constantes, los atributos y las asociaciones que aparecen en el diagrama.
Clase CalculadorImpuestos:
Constantes:
Asociaciones:
Clase Vehículo:
Atributos:
Clase RangoImpuesto:
Atributos:
3.3. Definición de los Contratos
Describimos a continuación los contratos de los principales métodos de la clase CalculadorImpuestos. Estos son los métodos que invocaremos desde la interfaz para pedir los servicios que solicite el usuario, pasándoles como parámetros la información que éste ingrese.
Método constructor:
/**
* Crea un calculador de impuestos, cargando la información de dos archivos.<br>
* <b>post: </b> Se inicializaron los arreglos de vehículos y rangos.<br>
* Se cargaron los datos correctamente a partir de los archivos.<br>
* @throws Exception Si hay algún error al tratar de leer los archivos.
*/
public CalculadorImpuestos( ) throws Exception
{ ... }
Leyendo este contrato podemos deducir tres cosas: el constructor sabe dónde encontrar sus archivos para leerlos (no es nuestro problema definir su localización), el contenido de dichos archivos debe ser correcto (el método no va a hacer ninguna verificación interna) y si hay algún error físico de lectura de los archivos, va a lanzar una excepción que deberá atrapar quien llame al constructor.
En algún punto de la interfaz de usuario, con la instrucción que aparece a continuación, vamos a construir un objeto que representará el modelo del mundo. Dicha instrucción debe encontrarse dentro de un try-catch que nos permita atrapar la excepción que puede generarse.
CalculadorImpuestos calculador = new CalculadorImpuestos( );
Calcular pago de impuesto:
/**
* Calcula el pago de impuesto que debe hacer el vehículo actual.
* <b>pre:</b> Las listas de rangos y vehículos están inicializadas.
* @param pDescProntoPago Indica si aplica el descuento por pronto pago.
* @param pDescServicioPublico Indica si aplica el descuento por servicio público.
* @param pDescTrasladoCuenta Indica si aplica el descuento por traslado de cuenta.
* @return Valor por pagar de acuerdo con las características del vehículo y los
* descuentos que se pueden aplicar. Si no encuentra un rango para el modelo devuelve 0.
*/
double calcularPago( boolean pDescProntoPago, boolean pDescServicioPublico, boolean pDescTrasladoCuenta )
{ ... }
Este caso está orientado a la construcción de la interfaz del programa, por lo que suponemos que ya se han implementado el modelo conceptual y las pruebas unitarias del mismo.
En las próximas secciones vamos a estudiar:
- Cómo se organizan los elementos gráficos de la interfaz de usuario en clases Java.
- Cómo se asignan las responsabilidades.
- Cómo se maneja la interacción con el usuario.
Todo esto se ilustrará con el programa del caso de estudio, el cual construiremos paso a paso, dando respuesta a los tres puntos planteados anteriormente.