Si vamos a abstraer de lenguajes particulares, marcos y sus propias interpretaciones, la jerarquía de granularidad de software abstracta es la siguiente:
Product - application, library, service
Module - GUI, core logic, data, etc...
Component - purpose specific collection of objects
Object - collection of primitives
Primitive - numbers, functions, etc...
Claro y simple, el Producto es una colección funcional de módulos funcionales conectados.
Como su propio nombre lo indica, la motivación de un Módulo es la modularidad. Al contrario de lo que muchos afirman, en realidad no implica la reutilización del código. Hay muchos módulos que no son realmente reutilizables y no encajan con nada para lo que no fueron diseñados.
Es importante separar las diferentes capas de software, lo que hace que el software sea mucho más fácil de implementar y mantener, y en caso de que sea necesario volver a implementar algo como un front end a un marco de GUI diferente, la modularidad permite que eso suceda de una manera fácil y segura, sin interrupciones código por todo el lugar.
Un módulo encapsula una colección de componentes que cumplen un propósito común según lo definido por los requisitos del módulo. Un módulo debe ser autónomo y completo, y aunque no sea realmente utilizable por sí solo, debe poder funcionar junto con cualquier implementación conforme.
En términos de granularidad, el Componente se encuentra entre el Módulo y el Objeto. El propósito de un componente es reunir una colección de objetos de propósito general para formar una unidad específica de propósito.
Como su nombre lo indica, a diferencia del Módulo, el Componente no es "autónomo", es parte de un todo funcional más grande.
Los objetos son los bloques de construcción más pequeños de componentes. Los objetos son colecciones de primitivas y las unen para servir a un nivel inferior, más universal y con un propósito específico.
Las primitivas son el nivel más pequeño, más simple y más bajo de granularidad de desarrollo de software. Básicamente es solo números enteros y reales y funciones / operadores, aunque la mayoría de los idiomas tienen sus propios "ciudadanos de primera clase" adicionales.
Es muy poco lo que puedes hacer con los primitivos, y al mismo tiempo, es a un nivel tan bajo que puedes lograr prácticamente todo con él. Es muy, muy detallado, increíblemente complicado e imposiblemente tedioso de lograr mientras se trabaja directamente con los primitivos.
- ¿Cuál es el punto de todo esto?
Como ya se mencionó anteriormente, trabajar con primitivas directamente es una idea extremadamente mala. No solo porque es imposiblemente complejo, lento y tedioso de hacer para el desarrollo de software moderno, sino que también es extremadamente molesto y obstructivo para las pruebas y el mantenimiento.
Tener todas esas partes conceptuales incorporadas en el desarrollo de software lo hace más fácil, más rápido, más simple y más seguro. No haces una casa con átomos, independientemente de cuán versátiles y universales sean los átomos. Eso sería un ejercicio de futilidad. Sus átomos son sus primitivos, la arcilla es su objeto, los ladrillos son sus componentes, las paredes, el piso y el techo son sus módulos, ensamblados juntos manifiestan el producto final.
Los humanos realmente no inventamos nada, solo descubrimos cosas que ya existen en el universo, y luego las copiamos y aplicamos a nuestras vidas. La misma jerarquía de granularidad es intrínseca al universo mismo, desde los átomos e incluso debajo, hasta las moléculas orgánicas, proteínas, tejidos, órganos, organismos y superiores, la realidad misma obedece al mismo principio: combinar cosas abstractas pequeñas, simples, de función limitada y propósito en Cosas más grandes, más complejas, más funcionales y más específicas.
- Advertencias de terminología
Técnicamente, todos son "objetos", son todos "componentes" del desarrollo de software, son todos lo suficientemente "modulares" para poder encajar, son todos "productos" en el sentido de que han sido producidos, etc. ..
No se trata de terminología o nomenclatura, se trata de cómo la ampliación de las cosas afecta a varios aspectos de la creatividad y la productividad. Y sobre la importancia de no solo usar todos esos niveles diferentes, sino también la importancia de no tratar de lograr un objetivo en el nivel incorrecto, que solo puede ser contraproducente.