Se vogliamo astrarre da particolari linguaggi, quadri e loro interpretazioni, la gerarchia di 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...
Chiaro e semplice, il Prodotto è una raccolta funzionante di moduli funzionali collegati.
Come suggerisce il nome stesso, la motivazione di un modulo è la modularità. Contrariamente a quanto sostengono molti, non implica davvero il riutilizzo del codice. Esistono molti moduli che non sono realmente riutilizzabili e non si adattano a nulla per cui non sono stati progettati.
È importante separare diversi livelli software, il che rende il software molto più facile da implementare e mantenere e, se fosse necessario reimplementare qualcosa come un front-end in un diverso framework GUI, la modularità consente che ciò avvenga in modo facile e sicuro, senza rompere 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 insieme a qualsiasi implementazione conforme.
In termini di granularità, il componente si trova tra il modulo e l'oggetto. Lo scopo di un componente è quello di mettere insieme una raccolta di oggetti di uso generale per formare un'unità specifica di scopo.
Come suggerisce il nome, a differenza del Modulo, il Componente non è "autonomo", fa parte di un insieme funzionale più ampio.
Gli oggetti sono i mattoni più piccoli dei componenti. Gli oggetti sono raccolte di primitivi e li accoppiano per servire a un livello più basso, più universale pur mantenendo uno scopo in qualche modo specifico.
I primitivi rappresentano il livello più piccolo, più semplice e più basso di granularità nello sviluppo del software. Fondamentalmente è 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 praticamente realizzare tutto con esso. È solo molto, molto dettagliato, follemente complicato e incredibilmente 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 di software moderno, ma è anche estremamente invadente e ostruttivo per i test e la manutenzione.
Avere tutte quelle parti concettuali incorporate nello sviluppo del software rende tutto più semplice, veloce, semplice e sicuro. Non costruisci una casa con gli atomi, indipendentemente da quanto siano versatili e universali gli atomi. Sarebbe un esercizio di futilità. I tuoi atomi sono i tuoi primitivi, l'argilla è il tuo oggetto, i mattoni sono i tuoi componenti, le pareti, il pavimento e il tetto sono i tuoi moduli, assemblati insieme manifestano il prodotto finale.
Gli umani non inventano davvero nulla, scopriamo solo cose già là fuori nell'universo, quindi le copiamo e le 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, agli organismi e al di sopra, la realtà stessa obbedisce allo stesso principio - combinando piccole, semplici funzioni limitate e scopo cose astratte in cose più grandi, più complesse, più funzionali e cose più specifiche per scopi.
- Avvertenze terminologiche
Tecnicamente sono tutti "oggetti", sono tutti "componenti" dello sviluppo del software, sono tutti "modulari" abbastanza da poter stare insieme, sono tutti "prodotti" nel senso che sono stati prodotti e così via. ..
Non si tratta di terminologia o nomenclatura, ma di come il ridimensionamento delle cose influenzi vari aspetti della creatività e della produttività. E sull'importanza di non solo usare tutti quei diversi livelli, ma anche l'importanza di non cercare di raggiungere un obiettivo al livello sbagliato, che può essere solo controproducente.