Colocar tanto la interfaz como la implementación es un lugar común y no parece ser un problema.
Tomemos, por ejemplo, la API de Java: la mayoría de las clases tienen ambas interfaces y sus implementaciones incluidas en el mismo paquete.
Tomemos, por ejemplo, el java.utilpaquete:
Contiene los interfaces como Set, Map, List, mientras que también tiene las implementaciones tales como HashSet, HashMapy ArrayList.
Además, los Javadocs están diseñados para funcionar bien en esas condiciones, ya que separa la documentación en las vistas Interfaces y Clases al mostrar el contenido del paquete.
Tener paquetes solo para interfaces puede ser un poco excesivo, a menos que haya una gran cantidad de interfaces. Pero separar las interfaces en sus propios paquetes por el simple hecho de hacerlo parece una mala práctica.
Si es necesario diferenciar el nombre de una interfaz de una implementación, se podría tener una convención de nomenclatura para facilitar la identificación de las interfaces:
Prefije el nombre de la interfaz con un I. Este enfoque se toma con las interfaces en el marco .NET. Sería bastante fácil decir que IListes una interfaz para una lista.
Utilice el ablesufijo - . Este enfoque se ve a menudo en la API de Java, como por ejemplo Comparable, Iterabley Serializablepara nombrar unos pocos.