Diseño de la solución

El servicio

En la base de datos que creamos existe una tabla donde se ubican las provincias del país (tabla PROVINCIA). Esta tabla está conformada por su PK (el id) y el nombre de la provincia (entre otros datos).
Se requiere un servicio que, dado un id de provincia, devuelva la provincia en cuestión. El contrato de negocio deberá ser tal que:

  • si se invoca con un id existente, se devuelve la provincia correspondiente
  • si se invoca con un id inexistente, se devuelve null
  • si se invoca con un null, se tira una java.lang.IllegalArgumentException

Diseño de la solución

Durante la construcción del sistema usaremos TDD. Sin embargo, previo al inicio de la codificación, deberemos diseñar la solución completa que implementaremos.

Diagramas y clases de la solución

Recordando la arquitectura planteada, deberemos resolver la lógica de negocio y la lógica de acceso a datos.

Primero y fundamental, deberemos diseñar nuestro objeto de dominio: la Provincia.

Además, al tener 2 capas, deberemos realizar 2 interfaces: una para el Service (la lógica de negocio) y otra para nuestro Repository (el acceso a datos). Luego deberemos crear las implementaciones de estas interfaces.

En resumen, vas a tener que generar un diagrama de clases con los siguientes elementos, con los nombres y paquetes que se indican a continuación:

  • el objeto de dominio Provincia: com.dosideas.domain.Provincia
  • la interfaz del Service: com.dosideas.service.ProvinciaService
  • la implementación del Service: com.dosideas.service.impl.ProvinciaServiceImpl
  • la interfaz del Repository: com.dosideas.repository.ProvinciaRepository
  • la implementación del Repository: com.dosideas.repository.impl.ProvinciaRepositoryImpl

La interfaz del Service tendrá entonces un único método:

 Provincia buscarPorId(Long id);

La interfaz del Repository tendrá también un único método, que buscará en la base de datos una Provincia a partir de su id. La firma de este método será:

 Provincia findOne(Long id);

(más adelante veremos porqué usamos este nombre "raro" de firma para el repositorio)

También deberás agregar los atributos de la clase Provincia. ¡No te olvides de seguir las convenciones de Java!

Además, deberás diseñar un diagrama de secuencia donde se muestre la interacción entre estas clases (es decir, cómo resolverán las implementaciones las llamadas entre si).

Sobre la implementación del Repository

No te preocupes por la implementación del Repository: ya veremos más adelante cómo acceder a la base de datos. Iniciaremos creando un Repository que devuelva datos "programáticamente", sin acceder a una base de datos real. Es decir, el nombre de la implementación del Repository tendrá la palabra "Dummy" para identificar esta implementación "rápida" de la real.

Nota sobre el API del servicio

El servicio buscarPorId está recibiendo un Long como parámetro. ¿Se te ocurre alguna optimización para la firma de este método?

Conclusión: diseño terminado

Con el diseño terminado, deberás tener toda la estructura de tu aplicación, con todas las clases que la resolverán. Es interesante notar que las interfaces de las capas no cambiarán a lo largo del curso: agregaremos mucha más funcionalidad y cambios en la implementación (montones!), pero nunca deberemos modificar la interfaz del negocio.

¡Comenzamos con el taller! Veremos el problema a resolver (un servicio que deberá exponerse), y diseñaremos la solución para este problema.