Pensé en esto hace un tiempo y recientemente resurgió cuando mi tienda está haciendo su primera aplicación web Java real.
Como introducción, veo dos estrategias principales de nomenclatura de paquetes. (Para ser claros, no me refiero a toda la parte 'domain.company.project' de esto, me refiero a la convención de paquetes debajo de eso). De todos modos, las convenciones de nomenclatura de paquetes que veo son las siguientes:
Funcional: Nombrar sus paquetes según su función arquitectónica en lugar de su identidad según el dominio comercial. Otro término para esto podría ser nombrar según 'capa'. Entonces, tendrías un paquete * .ui y un paquete * .domain y un paquete * .orm. Sus paquetes son cortes horizontales en lugar de verticales.
Esto es mucho más común que la denominación lógica. De hecho, no creo haber visto ni oído hablar de un proyecto que haga esto. Por supuesto, esto me hace receloso (algo así como pensar que has encontrado una solución a un problema de NP), ya que no soy muy inteligente y supongo que todos deben tener buenas razones para hacerlo de la forma en que lo hacen. Por otro lado, no me opongo a que la gente simplemente extrañe al elefante en la habitación y nunca escuché un argumento real para nombrar paquetes de esta manera. Simplemente parece ser el estándar de facto.
Lógico: Nombrar sus paquetes de acuerdo con su identidad de dominio comercial y poner cada clase que tiene que ver con esa porción vertical de funcionalidad en ese paquete.
Nunca había visto ni oído hablar de esto, como mencioné antes, pero tiene mucho sentido para mí.
Tiendo a acercarme a los sistemas verticalmente en lugar de horizontalmente. Quiero entrar y desarrollar el sistema de procesamiento de pedidos, no la capa de acceso a datos. Obviamente, hay una buena posibilidad de que toque la capa de acceso a datos en el desarrollo de ese sistema, pero el punto es que no lo veo de esa manera. Lo que esto significa, por supuesto, es que cuando recibo una orden de cambio o quiero implementar alguna característica nueva, sería bueno no tener que andar buscando en un montón de paquetes para encontrar todas las clases relacionadas. En cambio, solo miro en el paquete X porque lo que estoy haciendo tiene que ver con X.
Desde el punto de vista del desarrollo, veo como una gran ventaja que sus paquetes documenten el dominio de su negocio en lugar de su arquitectura. Siento que el dominio es casi siempre la parte del sistema que es más difícil de asimilar, ya que la arquitectura del sistema, especialmente en este punto, se está volviendo casi mundana en su implementación. El hecho de que pueda llegar a un sistema con este tipo de convención de nomenclatura e instantáneamente desde la nomenclatura de los paquetes saber que se trata de pedidos, clientes, empresas, productos, etc., parece bastante útil.
Parece que esto le permitiría aprovechar mucho mejor los modificadores de acceso de Java. Esto le permite definir interfaces de manera mucho más limpia en subsistemas que en capas del sistema. Entonces, si tiene un subsistema de pedidos que desea que sea persistente de manera transparente, en teoría, nunca podría dejar que nadie sepa que es persistente al no tener que crear interfaces públicas para sus clases de persistencia en la capa dao y, en su lugar, empaquetar la clase dao en sólo con las clases de las que trata. Obviamente, si desea exponer esta funcionalidad, puede proporcionar una interfaz para ella o hacerla pública. Parece que pierde mucho de esto al dividir una porción vertical de las funciones de su sistema en varios paquetes.
Supongo que una desventaja que puedo ver es que hace que arrancar capas sea un poco más difícil. En lugar de simplemente eliminar o cambiar el nombre de un paquete y luego colocar uno nuevo en su lugar con una tecnología alternativa, debe ingresar y cambiar todas las clases en todos los paquetes. Sin embargo, no veo que esto sea gran cosa. Puede ser por falta de experiencia, pero tengo que imaginar que la cantidad de veces que intercambia tecnologías palidece en comparación con la cantidad de veces que ingresa y edita segmentos de características verticales dentro de su sistema.
Entonces, supongo que la pregunta se le haría a usted, ¿cómo nombran sus paquetes y por qué? Por favor, comprenda que no creo necesariamente que me haya topado con la gallina de los huevos de oro o algo así. Soy bastante nuevo en todo esto y tengo mayormente experiencia académica. Sin embargo, no puedo detectar los agujeros en mi razonamiento, así que espero que todos puedan para que yo pueda seguir adelante.