Resumen
Un módulo, en el área del desarrollo de software, se puede definir como una parte autosuficiente de un sistema mucho mayor, y las características de un buen módulo están dadas
por tener alta cohesión, es decir que todos los elementos del módulo tienen la tarea de
solucionar o brindar una funcionalidad en común, y un bajo acoplamiento, es decir que los
elementos del módulo dependen poco o nada de otros elementos que existan en un módulo
diferente.
Actualmente la modularidad en Java está definida por la noción de “paquetes”, los cuales
son agrupaciones de clases. Estas clases a su vez, al igual que los métodos en ellas, tienen
modificadores que controlan su visibilidad (public, protected, private). Para que
cierta parte del código sea visible de un paquete a otro, este debe ser declarado public, lo
que hace que dicho código sea accesible a cualquier otro paquete, lo cual conlleva a
exponer detalles de la implementación.
Incluso si el diseño de una aplicación hace que esta esté idealmente organizada, es decir,
que todas las clases e interfaces están idealmente organizadas en paquetes sin que exista la
falla expuesta en el párrafo anterior, que existan capas funcionales en la aplicación, que se
utilice una herramienta para la Inyección de Dependencias tal como Spring, o incluso que
el proyecto como tal esté dividido en diferentes proyectos de compilación; al final toda la
aplicación tiene que ser implementada en un único archivo WAR, y esto no es realmente
modularidad