2010-01-29 11 views
18

¿Deberían las interfaces en Java residir en su propio directorio? ¿O deberían colocarse tanto la interfaz como su implementación en el mismo directorio (paquete)? Gracias.Estructura de directorio de interfaces Java?

+0

dependiendo de la lógica para diseñar paquetes, a menudo agregaré un subpaquete 'impl' para designar las implementaciones, como: com.stackoverflow.questions, com.stackoverflow.questions.impl. – Kylar

Respuesta

11

Las interfaces no necesitan específicamente su propio directorio. Deben colocarse donde tenga sentido, al igual que las clases deben colocarse donde tengan sentido. En muchos casos, puede tener sentido colocarlos en el mismo lugar.

1

Mismo paquete. El usuario no debe saber ni preocuparse de que estén usando una interfaz

+6

Sí. El uso del prefijo 'I' es nuts. –

+0

El usuario necesita saber si tienen que crear instancias de estas clases. – Powerlord

+2

"Mismo paquete" no responde la pregunta. Es muy común tener una prueba unitaria en el mismo paquete que la clase que está probando, pero tenerla en un directorio completamente diferente. – SyntaxT3rr0r

14

Un patrón que he visto es poner las interfaces en un directorio base, luego colocar las implementaciones en un subdirectorio desde allí.

Por ejemplo, las interfaces pueden ir aquí:

com.myproject.data.dao.CustomerDao (some people do ICustomerDao for interfaces, but some don't like that.) 
com.myproject.data.dao.ProductDao 

Y las implementaciones podrían ir aquí:

com.myproject.data.dao.hibernate.HibernateCustomerDao 
com.myproject.data.dao.hibernate.HibernateProductDao 
com.myproject.data.dao.someotherorm.SomeOtherOrmCustomerDao 
etc. 

Esto podría funcionar en algunas situaciones, y puede que no en otros, pero sólo algo para pensar en.

+0

gracias por esta perspectiva – ken

+0

Terminé tomando este enfoque para un proyecto. Me di cuenta de que realmente no quiero que los usuarios tengan acceso a otra cosa que no sea la interfaz. Según entiendo, esto no es posible si las clases están separadas en sus propios paquetes (el nivel de acceso debe ser público). Prefiero el enfoque que has dado, pero para el caso que he dado no funciona bien. – abrarisme

0

No es necesario colocar la interfaz en el mismo directorio (paquete). Si su interfaz tiene acceso público, puede importarla en cualquier lugar, en cualquier paquete.

-1

La pregunta mientras la leo (pero luego está extrañamente formulada) no es si la interfaz debe estar en su propio directorio o no. La pregunta es si debe volver a crear su completa estructura de directorios (negrita para enfatizar lo que es en el título de la pregunta), donde una rama contendría sólo las interfaces, así:

pureooabstraction/ 
| 
|_com/ 
    | 
    |_example/ 
    | 
    |__SomeInterface.java 
    |__SomeOtherInterface.java 

src/ 
| 
|_com/ 
    | 
    |_example/ 
    | 
    |__SomeClass.java 
    |__... 

Cuando el/ directorio pureooabstraction la estructura contendría solo "clases abstractas puras" (desde un punto de vista OO, no la definición 'abstracta' de Java), también conocidas como interfaces en Java.

Y los pequeños detalles de implementación (que no existen en el nivel OOA/OOD) donde se encuentra el "código" irían en el directorio src/.

Sin duda tiene sentido si su proceso de desarrollo va de OOA a OOD a OOP.

+0

no, él solo estaba preguntando si poner las interfaces en el mismo paquete que las implementaciones –

5

Como ya hay algunos buenos puntos, sólo quiero añadir una cosa:

En algunos proyectos incluso hemos llegado tan lejos que colocamos todas las interfaces en un sub-proyecto (módulo experto) y las implementaciones en otro uno. De esta forma, fue posible separar COMPLETAMENTE las interfaces de las implementaciones y finalizar el proyecto de interfaz muy temprano en el proyecto y entregarlo a otros equipos que trabajan en esas interfaces. Dentro de cada uno de los proyectos usamos los mismos paquetes.

En general, diría que debe separar las interfaces y sus implementaciones, de la misma manera no importa, siempre y cuando sea coherente con ellas.

0

Donde quiera, pero está absolutamente bien mantener las interfaces en el mismo paquete y estructura de directorios. Solo mira el java api. Si selecciona alguno de los paquetes, notará que muchos contienen ambas clases e interfaces.Algunas de las interfaces se implementan por clases en el mismo paquete y otras no.

Creo que la peor práctica es insistir en que debe tener un directorio diferente para las interfaces. He visto directorios como/services y/impl y otros, que solo bloquean la estructura del directorio. En mi lugar de trabajo actual empleamos muchos contratistas que van y vienen, y algunos de nuestros proyectos tienen múltiples tipos de directorios de interfaz. La única vez que creo que tiene sentido usar un directorio separado es si planea copiar las interfaces en otros proyectos, por ejemplo para los EJB, pero incluso así pueden tener el mismo paquete si usa un proyecto compartido para las interfaces.

Por lo tanto, la respuesta breve es, en cualquier lugar que desee, pero no cree que deba separar sus clases y sus interfaces. En muchos casos, es preferible mantenerlos en el mismo paquete/directorio.

Cuestiones relacionadas