Nozioni di base sulla progettazione del software

La progettazione del software è un processo per trasformare i requisiti dell'utente in una forma adeguata, che aiuta il programmatore nella codifica e nell'implementazione del software.

Per valutare i requisiti degli utenti, viene creato un documento SRS (Software Requirement Specification) mentre per la codifica e l'implementazione, sono necessari requisiti più specifici e dettagliati in termini di software. L'output di questo processo può essere utilizzato direttamente nell'implementazione nei linguaggi di programmazione.

La progettazione del software è il primo passo in SDLC (Software Design Life Cycle), che sposta la concentrazione dal dominio del problema al dominio della soluzione. Cerca di specificare come soddisfare i requisiti menzionati in SRS.

Livelli di progettazione del software

La progettazione del software produce tre livelli di risultati:

  • Architectural Design - Il progetto architettonico è la più alta versione astratta del sistema. Identifica il software come un sistema con molti componenti che interagiscono tra loro. A questo livello, i progettisti ottengono l'idea del dominio della soluzione proposta.
  • High-level Design- Il design di alto livello rompe il concetto di "singola entità-componente multiplo" del design architettonico in una visione meno astratta di sottosistemi e moduli e descrive la loro interazione reciproca. La progettazione di alto livello si concentra su come il sistema e tutti i suoi componenti possono essere implementati in forme di moduli. Riconosce la struttura modulare di ogni sottosistema e la loro relazione e interazione tra loro.
  • Detailed Design- La progettazione dettagliata si occupa della parte di implementazione di ciò che è visto come un sistema e dei suoi sottosistemi nei due progetti precedenti. È più dettagliato verso i moduli e le loro implementazioni. Definisce la struttura logica di ogni modulo e le loro interfacce per comunicare con altri moduli.

Modularizzazione

La modularizzazione è una tecnica per dividere un sistema software in più moduli discreti e indipendenti, che dovrebbero essere in grado di svolgere attività in modo indipendente. Questi moduli possono funzionare come costrutti di base per l'intero software. I progettisti tendono a progettare moduli in modo tale che possano essere eseguiti e / o compilati separatamente e indipendentemente.

Il design modulare segue involontariamente le regole della strategia di risoluzione dei problemi "divide et impera", questo perché ci sono molti altri vantaggi associati al design modulare di un software.

Vantaggio della modularizzazione:

  • I componenti più piccoli sono più facili da mantenere
  • Il programma può essere suddiviso in base agli aspetti funzionali
  • Il livello di astrazione desiderato può essere portato nel programma
  • I componenti con elevata coesione possono essere riutilizzati
  • È possibile rendere possibile l'esecuzione simultanea
  • Desiderato dall'aspetto della sicurezza

Concorrenza

Indietro nel tempo, tutto il software deve essere eseguito in sequenza. Per esecuzione sequenziale si intende che le istruzioni codificate verranno eseguite una dopo l'altra, il che implica che solo una parte del programma viene attivata in un dato momento. Ad esempio, un software ha più moduli, quindi solo uno di tutti i moduli può essere trovato attivo in qualsiasi momento dell'esecuzione.

Nella progettazione del software, la concorrenza viene implementata suddividendo il software in più unità di esecuzione indipendenti, come i moduli, ed eseguendole in parallelo. In altre parole, la concorrenza fornisce al software la capacità di eseguire più di una parte di codice in parallelo tra loro.

È necessario che i programmatori e i progettisti riconoscano quei moduli, che possono essere eseguiti in parallelo.

Esempio

La funzione di controllo ortografico nell'elaboratore di testi è un modulo del software, che funziona a fianco dell'elaboratore di testi stesso.

Accoppiamento e coesione

Quando un programma software è modularizzato, i suoi compiti sono suddivisi in più moduli in base ad alcune caratteristiche. Come sappiamo, i moduli sono un insieme di istruzioni messe insieme per eseguire alcune attività. Tuttavia, sono considerati come entità singole ma possono fare riferimento tra loro per lavorare insieme. Ci sono misure in base alle quali è possibile misurare la qualità di un progetto di moduli e la loro interazione tra di loro. Queste misure sono chiamate accoppiamento e coesione.

Coesione

La coesione è una misura che definisce il grado di intra-affidabilità all'interno degli elementi di un modulo. Maggiore è la coesione, migliore è la struttura del programma.

Esistono sette tipi di coesione, vale a dire:

  • Co-incidental cohesion -È una coesione casuale e non pianificata, che potrebbe essere il risultato della suddivisione del programma in moduli più piccoli per motivi di modularizzazione. Poiché non è pianificato, può creare confusione ai programmatori e generalmente non è accettato.
  • Logical cohesion - Quando elementi categorizzati logicamente vengono messi insieme in un modulo, si parla di coesione logica.
  • Temporal Cohesion - Quando gli elementi del modulo sono organizzati in modo tale da essere elaborati in un momento simile nel tempo, si parla di coesione temporale.
  • Procedural cohesion - Quando gli elementi del modulo sono raggruppati insieme, che vengono eseguiti in sequenza per eseguire un'attività, si parla di coesione procedurale.
  • Communicational cohesion - Quando gli elementi del modulo sono raggruppati insieme, che vengono eseguiti in sequenza e lavorano sugli stessi dati (informazioni), si parla di coesione comunicativa.
  • Sequential cohesion - Quando gli elementi del modulo sono raggruppati perché l'output di un elemento funge da input per un altro e così via, si parla di coesione sequenziale.
  • Functional cohesion - È considerato il più alto grado di coesione ed è altamente previsto. Gli elementi del modulo in coesione funzionale sono raggruppati perché contribuiscono tutti a un'unica funzione ben definita. Può anche essere riutilizzato.

Accoppiamento

L'accoppiamento è una misura che definisce il livello di interdipendenza tra i moduli di un programma. Indica a quale livello i moduli interferiscono e interagiscono tra loro. Più basso è l'accoppiamento, migliore è il programma.

Esistono cinque livelli di accoppiamento, vale a dire:

  • Content coupling - Quando un modulo può accedere direttamente o modificare o fare riferimento al contenuto di un altro modulo, si parla di accoppiamento a livello di contenuto.
  • Common coupling- Quando più moduli hanno accesso in lettura e scrittura ad alcuni dati globali, si parla di accoppiamento comune o globale.
  • Control coupling- Due moduli sono chiamati accoppiati al controllo se uno di loro decide la funzione dell'altro modulo o ne modifica il flusso di esecuzione.
  • Stamp coupling- Quando più moduli condividono una struttura dati comune e lavorano su parti diverse di essa, si parla di accoppiamento timbro.
  • Data coupling- L'accoppiamento dei dati avviene quando due moduli interagiscono tra loro tramite il passaggio di dati (come parametro). Se un modulo passa la struttura dei dati come parametro, il modulo ricevente dovrebbe utilizzare tutti i suoi componenti.

Idealmente, nessun accoppiamento è considerato il migliore.

Verifica del progetto

L'output del processo di progettazione del software è la documentazione di progettazione, pseudo codici, diagrammi logici dettagliati, diagrammi di processo e descrizione dettagliata di tutti i requisiti funzionali o non funzionali.

La fase successiva, che è l'implementazione del software, dipende da tutti gli output sopra menzionati.

Diventa quindi necessario verificare l'uscita prima di procedere alla fase successiva. Prima viene rilevato un errore, meglio è o potrebbe non essere rilevato fino al test del prodotto. Se gli output della fase di progettazione sono in forma di notazione formale, è necessario utilizzare gli strumenti di verifica associati, altrimenti è possibile utilizzare una revisione approfondita del progetto per la verifica e la convalida.

Con un approccio di verifica strutturato, i revisori possono rilevare i difetti che potrebbero essere causati trascurando alcune condizioni. Una buona revisione del progetto è importante per una buona progettazione, accuratezza e qualità del software.