¿Está bien tener dependencias dentro de una clase que debe ser intercambiable?

8

Digamos que tengo un modelo de dominio y quiero leerlo y guardarlo desde cualquier capa de persistencia; en este momento podría ser un archivo json pero en el futuro podría ser xml o una base de datos (que también podría cambiar en su tipo )

Para generar el dominio de modelo de la capa de persistencia, tengo una implementación de una simple interfaz que, digamos, contiene de un getAll()y saveAll()método. Si quiero cambiar a otro tipo de persistencia, simplemente puedo cambiar la implementación de la interfaz. Sin embargo, dentro de la implementación usaré soluciones completamente diferentes para leer y almacenar los datos, por lo que tendré que usar diferentes objetos de otras bibliotecas para manejar los datos.

Digamos que uso un serializador Json en la primera implementación, luego instanciaré la instancia de ese serializador en mi implementación directamente. Esto conducirá a mi implementación directamente dependiendo de ese serializador, nunca puedo darle otro. Pero esto no sería posible de todos modos, porque no hay una interfaz universal para los serializadores (o cualquier tipo de persistencia). Entonces, si quiero usar un serializador diferente, lo único que puedo hacer es escribir una implementación completamente nueva en lugar de simplemente pasar otra desde el exterior.

Entonces, ¿está bien codificar dependencias en este caso? ¿O hay una mejor opción?

Philip Feldmann
fuente

Respuestas:

4

Con referencia a mi respuesta a una pregunta reciente , la clave aquí es separar las interfaces de la capa de persistencia de cualquier implementación de la capa de persistencia, utilizando el patrón de escalera.

La dependencia del serializador Json se convierte en un detalle de implementación del paquete de persistencia Json. El resto de la aplicación no necesita saber nada al respecto, ni sufrir la carga de esa dependencia, ya que solo accede al paquete de persistencia a través de las interfaces, que están en otro paquete.

Si luego agrega un paquete de persistencia de la base de datos, simplemente implementa esas interfaces y, por ejemplo, sus dependencias ORM también se ocultan como un detalle de implementación.

David Arno
fuente
2

No puede eliminar todas las dependencias de su código; eventualmente tienes que depender de algo , de lo contrario solo terminarás con un dios-objeto gigante que hace todo por sí mismo.

Como regla general, desea que cada clase dependa de objetos que sean más estables que ellos mismos; y desea relaciones inestables para usar la inyección de dependencia para permitir pruebas más fáciles y más flexibilidad.

¿Qué posibilidades hay de que cambie el serializador JSON? ¿Es más o menos estable que el código que está escribiendo?

Si es probable que vaya a reemplazar el serializador más de una vez con una implementación diferente, entonces quizás pueda crear un proxy o un objeto envoltorio alrededor del serializador. De esa manera, puede controlar la interfaz que tiene con el serializador y solo depender de una biblioteca externa en un lugar.

Dicho esto, personalmente aún no he encontrado una razón para reemplazar un serializador JSON (con un serializador diferente), por lo que no me preocuparía demasiado por tener una dependencia directa de él. Un serializador siempre tendrá una interfaz más estable que cualquier otra en mis propias aplicaciones, y los métodos que necesito de él son tan simples y pocos que no hay realmente una razón para que cambien.

Sin embargo, parece que no está preocupado específicamente por el cambio del serializador en sí mismo ; por lo que describió, le preocupa que los requisitos externos cambien a un sistema de persistencia totalmente diferente, en cuyo caso, la implementación de la capa de persistencia se reescribirá por completo de todos modos, y usar la inyección de dependencia o un proxy no te ayudará.

Mientras la interfaz entre su capa de persistencia y sus modelos de dominio permanezca igual, y se esté burlando de esa capa de persistencia cuando pruebe sus modelos de dominio, no veo ningún problema con depender de una interfaz específica de una biblioteca JSON. Esa dependencia es barata de probar, y es poco probable que la biblioteca JSON cambie.

Jen
fuente