2012-04-02 43 views
8

Estoy escribiendo algunos DAO simples en Java usando JDBC (no Spring, Hibernate o cualquier otra cosa).Estructura del paquete DAO

¿Es mejor poner los DAO de implementación en el mismo paquete que sus interfaces o ponerlos en un subpaquete?

Ejemplo:

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.MyDaoImpl 

O

com.mycompany.myproject.dao.MyDao 
com.mycompany.myproject.dao.impl.MyDaoImpl 

Si usted sugiere la estructura de sub-paquete, lo que sugeriría usted como un nombre de sub-paquete? .impl? .sql? .jdbc?

Realísticamente, no voy a tener múltiples implementaciones. ¿Estoy sobreingeniería?

+0

¿No hay implementaciones alternativas en absoluto? ¿Ni siquiera la prueba unitaria se burla? –

Respuesta

5

Cuando se diseña una aplicación no hay estándar manera de estructurar en paquetes, la experiencia es lo que generalmente ayuda a cada uno a decidir cuáles son los nombres apropiados para nuestros paquetes.

Acerca de las implementaciones de empaquetado de sus interfaces en el mismo paquete o en otro diferente, solo piense cómo está estructurado Java: generalmente una clase de implementación está empaquetada en el mismo paquete que su interfaz, pero no todas las veces.

Si estaba a punto de tener varias implementaciones de los mismos DAO, tendría sentido tenerlos estructurados en los paquetes secundarios .jdbc, .jpa o .jdo. Si solo va a tener una implementación, las dos opciones que enumera tienen algún sentido (el mismo paquete o un subpaquete .impl).

En cuanto a la sobreingeniería, le recomendaría este article. Aunque solo tendrá una implementación de sus DAO, tendría sentido definirlos como una interfaz e implementación, ya que eso le ayudará en un futuro potencial a reescribir sus DAO para otros marcos, mientras que el código que hace uso de ellos se mantienen sin cambios.

Al final, depende de usted (o de usted y de sus pares) llegar a un consenso y tomar la decisión que tenga más sentido en su caso específico.

EDITAR

Una aplicación normalmente tiene una implementación por interfaz DAO y que no es el exceso de ingeniería en absoluto, simplemente no tiene sentido tener la misma interfaz DAO implementado por la APP y de JDO . Algunos de los propósitos del uso de la interfaz/patrón de implementación es facilitar la refaccionamiento, la prueba mediante objetos simulados, etc.

PD: generalmente confío en JDepend para distribuir mis clases de aplicación en paquetes evitando ciclos como la mayoría como puedo.

2

Creo que tampoco es mejor, pero en este caso prefiero la primera alternativa. Sería en línea con tener ArrayList, LinkedList, etc., en el mismo paquete que List.

Al utilizar marcos adicionales, como hibernate, prefiero la segunda opción con MyDao y HibernateDao como implementador.

0

Los espacios de nombres y los paquetes solo existen para evitar colisiones. Ninguno de los dos es preferible siempre que sean únicos.

+1

Entonces, ¿está bien simplemente nombrar a sus paquetes cadenas largas y aleatorias de caracteres? Los nombres de paquetes sensatos hacen que sea más fácil para las personas navegar su API y pueden facilitar la refactorización. Además, la separación de, p. la implementación y la interfaz son buenas prácticas en entornos donde el paquete especifica exportaciones y dependencias, ya que a menudo solo se desea depender de la interfaz o la implementación. –

+0

Mi respuesta fue específica para el caso de OP. No hay una diferencia objetiva entre sus alternativas propuestas. Con respecto a su comentario, solo puedo decir que crear un espacio de nombres comprensible es de sentido común. – nsfyn55

2

Iría con su segunda opción (aunque ninguna es realmente mejor), porque puede ver inmediatamente en sus importaciones si se importa una impl y la refactorización sería más simple si desea mover su impl en otro proyecto.

Esto no requiere demasiada ingeniería. Hay varias ventajas de utilizar DAO:

  1. Mejora la calidad de su código desacoplando acceso a la base de otras consideraciones
  2. probar su código se hace más fácil y se puede probar con un grano más fino.
  3. Si algún día descubres que Hibernate es mucho más fácil para ti, no afectará el resto de tu código.