Se vogliamo astrarre da particolari linguaggi, framework e loro interpretazioni, la gerarchia della granularità del software astratto è la seguente:
Product - application, library, service
Module - GUI, core logic, data, etc...
Component - purpose specific collection of objects
Object - collection of primitives
Primitive - numbers, functions, etc...
Semplice e semplice, il prodotto è una raccolta funzionante di moduli funzionali.
Come suggerisce il nome stesso, la motivazione di un modulo è la modularità. Contrariamente a quanto sostengono molti, non implica realmente il riutilizzo del codice. Ci sono molti moduli che non sono veramente riutilizzabili e non si adattano a qualcosa a cui non sono stati progettati.
È importante separare i diversi livelli del software, il che rende il software molto più facile da implementare e mantenere, e se si ha la necessità di reimplementare qualcosa come un front-end in un diverso framework GUI, la modularità consente che ciò avvenga in modo facile e sicuro , senza infrangere il codice dappertutto.
Un modulo incapsula una raccolta di componenti che hanno tutti uno scopo comune, come definito dai requisiti del modulo. Un modulo dovrebbe essere autonomo e completo e, sebbene non sia realmente utilizzabile da solo, dovrebbe essere in grado di funzionare in concomitanza con qualsiasi implementazione conforme.
In termini di granularità il componente si trova tra il modulo e l'oggetto. Lo scopo di un componente è mettere insieme una collezione di oggetti di uso generale per formare un'unità specifica allo scopo.
Come suggerisce il nome, a differenza del modulo, il componente non è "autonomo", ma fa parte di un insieme funzionale più ampio.
Gli oggetti sono gli elementi costitutivi più piccoli dei componenti. Gli oggetti sono raccolte di primitivi e li accoppiano per servire un livello più basso, più universale e allo stesso tempo ancora uno scopo specifico.
I primitivi sono il più piccolo, il più semplice e il più basso livello di granularità dello sviluppo del software. In pratica sono solo numeri interi e reali e funzioni / operatori, sebbene la maggior parte delle lingue abbia i propri "cittadini di prima classe" aggiuntivi.
C'è molto poco che puoi fare con i primitivi e, allo stesso tempo, è a un livello così basso che puoi realizzare praticamente tutto con esso. È solo molto, molto prolisso, follemente complicato e impossibilmente noioso da realizzare mentre si lavora direttamente con i primitivi.
- Qual è il punto di tutto questo?
Come già accennato in precedenza, lavorare direttamente con i primitivi è una pessima idea. Non solo perché è incredibilmente complesso, lento e noioso da fare per lo sviluppo del software moderno, ma è anche estremamente invadente e ostruttivo ai test e alla manutenzione.
Avere tutte queste parti concettuali incorporate nello sviluppo del software rende tutto più facile, più veloce, più semplice e più sicuro.
Gli umani non inventano davvero nulla, noi scopriamo solo cose già là fuori nell'universo, e poi li copiamo e li applichiamo alle nostre vite. La stessa gerarchia di granularità è intrinseca all'universo stesso, dagli atomi e anche al di sotto, alle molecole organiche, alle proteine, ai tessuti, agli organi, e soprattutto, la realtà stessa obbedisce allo stesso principio - combinando piccole, semplici, funzioni limitate e scopi astratti in più grandi, più complesse, cose più funzionali e cose più specifiche.
- Avvertenze sulla terminologia
Tecnicamente sono tutti "oggetti", sono tutti "componenti" dello sviluppo del software, sono tutti "modulari" abbastanza per essere in grado di stare insieme, sono tutti "prodotti" nel senso che sono stati prodotti e così via ...
Non si tratta di terminologia o nomenclatura, ma di come la scalabilità delle cose influisce su vari aspetti della creatività e della produttività. E sull'importanza di non solo utilizzare tutti quei diversi livelli, ma anche l'importanza di non cercare di raggiungere un obiettivo al livello sbagliato, che può essere solo controproducente.