Re: Final del 17-9-2020
de Bustamante Tomás - Hola, Andreas:
Te dejo mis observaciones sobre tu solución propuesta:
- Los problemas de diseño detectados me parecen adecuados, aunque se podría ser más explícito de por qué resultan problemáticos en ese ejemplo puntual. La idea no es simplemente memorizar un principio de diseño sino entender las onsecuencias que suceden al no seguirlo.
- Hay algunos problemas de notación en el diagrama de clases. El sentido de la flecha entre Vehiculo y Cargable está al revés. Lo mismo sucede con la flecha entre RuntimeError y las correspondientes excepciones.
- El nombre del método "esCargable" que entienden todos los cargables es algo confuso. Por lo general, un nombre de ese estilo da a entender que devolverá un booleano, sin embargo en tu caso lo que hace es realizar una carga y no devuelve nada.
- La clase Vehiculo figura como abstracta en el diagrama pero no en el código.
- La clase Vehiculo instancia en su constructor un PortaBici y se lo guarda en un atributo de instancia, de manera tal que tanto Auto como Moto conocen al PortaBici. La consigna pedía que solamente el Auto pudiera equiparse con un PortaBici. Esto lo resolviste haciendo que Moto lance siempre una excepción, violando así LSP.
- La consigna pedía que no sea posible que una moto pueda cargar una bici y esto lo resolviste mediante el método "cargarSiEsPosible" pero, sin embargo, se puede cargar igual una bici mediante el método "cargar", que admite cualquier Cargable, entre ellos una instancia de Bici.
- El nombre del método "cargarSiEsPosible" tampoco es muy adecuado. Debería ser simplemente "cargar".
- El diagrama de secuencia no es muy claro. En el primer mensaje enviás un objeto "cargo" por parámetro que asumo que es una instancia de Bici a la que luego se le envía el segundo mensaje de la secuencia. Esto convendría definirlo como "cargo : Bici" en la caja del objeto en lugar de simplemente "Bici". Además, "bici" o "cargable" serían mejores nomrbes que "cargo" para esa variable. También sería conveniente que dibujes las cajas de activación de los métodos para entender mejor la secuencia cuando hay double dispatch (mediante "activate" y "deactivate" usando PlantUML).
- Este ejercicio en particular no tenía una solución ideal y dependía mucho de cómo se justificara la solución y se la comunicara. Acá podés encontrar una posible solución de la cátedra.
Saludos,
Tomás