Cátedra: Fontela
Fecha: Primera Oportunidad - (Primer Cuatrimestre) 2013
Día: 26/04/2013
Ejercicio conceptual. En la ciudad de Nueva América (nombre ficticio), para la educación secundaria existen las siguientes definiciones:
* Asignatura: es una materia de un año.
* Año: es el conjunto de asignaturas de un ciclo lectivo. Son 5 para todo el secundario.
* Trimestre: es la unidad mínima de aprobación, que corresponde a una asignatura y un año; se aprueba con 6.
Si un alumno aprueba los 3 trimestres, aprueba la materia. Sino, debe recuperar el trimestre que esté por debajo de 6, en el mes de Diciembre, con nota 6 como mínimo. De quedar trimestres sin aprobar de algunas asignaturas, la asignatura completa deberá recuperarse en el mes de febrero, debiendo obtener como mínimo un 4. Si luego de los exámenes de Febrero quedasen 3 o más asignaturas sin aprobar, el alumno repetirá el año. Si quedasen hasta 2 materias sin aprobar, se podrán rendir en el mes de Junio siguiente.
Una vez que un alumno aprueba los 5 años, se le otorgará el diploma de aprobación del secundario.
Se pide:
a) Haga un diagrama de estados de UML, con todos los eventos que provocan transiciones de estados. Use su criterio para elegir los estados relevantes y los nombres de los mismos.
b) Modelar en UML (digrama de clases) el dominio recién descripto. Use nombres adecuados para todas las clases, métodos y asociaciones que defina. Incluya todos los métodos que le parezca necesarios en las clases, pero ninguno más. Los métodos que utilice en los puntos c, d y e, deben figurar en el diagrama.
c) Modelar en UML (diagrama de secuencia, con objetos y mensajes) el algoritmo completo para la determinación de aprobación de una materia. Mantenga el nivel de abstracción adecuado, sin indicar cuestiones de implementación de métodos de clases ajenas a este escenario.
d) Escriba 3 de las pruebas automatizadas necesarias para probar el comportamiento modelado en el diagrama de secuencia, utilizando SUnit, e incluyendo al menos una prueba positiva y una negativa.
e) Escriba el código en Smalltalk que haga funcionar las pruebas del punto d, pero sin escribir nada de los métodos de otras clases (dicho de otra manera, los métodos de otras clases debe suponerlos implementados).
El artículo “Unit Testing Guidelines”, dice que hay que proveer tests negativos. ¿A qué se refiere? ¿Por qué le parece importante?
El código repetido suele mencionarse como un mal síntoma de diseño. Eliminarlo implicaría usar alguna refactorización, que dependerá de si la repetición se da dentro de una misma clase, entre dos clases hermanas o entre clases no vinculadas.
a) Explique qué es una refactorización, y qué se busca con la práctica de refactoring.
b) Relate las 3 refactorizaciones que haría en los 3 casos de código repetido mencionados más arriba, usando código o diagramas para mostrarlas.
c) ¿Qué hace que una refactorización sea tal y no otro tipo de cambio de código? ¿Cómo puede garantizar esto?