En esta parte del taller usted tendrá que diseñar e implementar una estructura que le permita representar contenedores de productos con las características y restricciones que presentaremos a continuación. Esa estructura podría incluir no sólo clases concretas sino también clases abstractas e interfaces.
La implementación que usted hará en esta parte debe cumplir con las siguientes restricciones: cualquier estructura de datos que usted utilice debe estar basada en el framework de colecciones (Java Collections) y cualquier recorrido de estas estructuras debe realizarse por medio de un iterador.
Descripción de los contenedores
En el contexto de nuestro taller, un contenedor es un gran recipiente metálico que permite transportar productos. Los productos dentro de un contenedor están agrupados en cargamentos. Cada cargamento tiene un propietario,
un identificador único y contiene una cierta cantidad de unidades de un mismo producto. Por ejemplo, un contenedor podría estar compuesto por un cargamento con 50.000 unidades del producto ‘Chocolate’ y un
cargamento compuesto por una unidad del producto ‘Nevera’, ambos propiedad de ‘Exito.com’.
Cada contenedor tiene una capacidad volumétrica (en metros cúbicos) y una capacidad por peso (en toneladas). La carga de un contenedor no puede exceder su capacidad, y el sistema debería verificar que se respeten estos límites cada vez que se intente agregar un cargamento a un contenedor.
Algunos contenedores son exclusivos para un tipo de producto. Es decir que, aunque pueden tener varios cargamentos, todos deben tener el mismo tipo de producto. Si se intenta agregar el cargamento equivocado a uno de estos contenedores, el sistema debería darse cuenta y evitarlo.
Cada contenedor debe ser capaz de generar su propio manifiesto. El manifiesto es un documento (cadena de caracteres) que describe cada uno de los cargamentos y tiene un resumen final de la carga. Este resumen debe incluir el peso y volumen total de la carga, así como las condiciones que se deben respetar (refrigeración requerida o no, temperatura máxima, si contiene productos tóxicos) teniendo en cuenta los cargamentos que lleve.
La restricción más importante con respecto a los cargamentos de un contenedor es que no pueden mezclarse productos tóxicos con productos perecederos. Adicionalmente, no pueden transportarse en el mismo contenedor productos que requieran temperaturas inferiores a 0 grados con productos no perecederos.
El orden en que se agreguen los cargamentos a un contenedor es importante y debe mantenerse. Es posible retirar un cargamento de un contenedor utilizando el identificador para señalarlo.
Finalmente, cualquier contenedor debe tener una implementación del método toString que permita conocer todas sus características.
Actividades
- Diseñe un conjunto de clases e interfaces para representar contenedores con las características recién descritas. Identifique con claridad los atributos y métodos de cada una.
- Implemente su modelo dentro del proyecto en Eclipse. Ubique todos los elementos dentro del paquete uniandes.dpoo.taller2.contenedores.modelo.
- Construya un diagrama de clases de UML que muestre todos los elementos de su diseño de la forma más clara posible. El diagrama de clases debe incluir atributos y métodos, y debe dejar claro cuáles elementos son clases
concretas, cuáles abstractas y cuáles son interfaces.
Validación
Construya una nueva clase dentro del paquete uniandes.dpoo.taller2.contenedores.test y agregue un
método main a esa clase. Dentro de ese método main construya productos y contenedores y muestre en la consola sus características. Asegúrese de que su programa de prueba involucre todos los elementos de su framework de
contenedores y que sirva para demostrar las características interesantes de su diseño.
Posiblemente sea buena idea construir métodos auxiliares que se concentren en demostrar o probar características particulares de su diseño y que le permitan simplificar el método main. Para que pueda llamar a
esos métodos auxiliares desde el main, ellos también tienen que estar definidos como static.
Es normal que su proceso sea iterativo y tenga que hacer cambios al diseño de las clases e interfaces debido a detalles que haya encontrado durante la implementación. Incluso, es posible que tenga que hacer cambios al
diseño del framework de productos. Cuando eso pase, intente reflexionar sobre la razón para el cambio y la razón para que usted no hubiera diseñado las cosas así desde el inicio.