Implementazione del software
In questo capitolo studieremo i metodi di programmazione, la documentazione e le sfide nell'implementazione del software.
Programmazione strutturata
Nel processo di codifica, le righe di codice continuano a moltiplicarsi, quindi la dimensione del software aumenta. A poco a poco, diventa quasi impossibile ricordare il flusso del programma. Se si dimentica come sono costruiti il software ei suoi programmi, file e procedure sottostanti, diventa molto difficile condividere, eseguire il debug e modificare il programma. La soluzione a questo problema è la programmazione strutturata. Incoraggia lo sviluppatore a utilizzare subroutine e loop invece di utilizzare semplici salti nel codice, portando così chiarezza nel codice e migliorandone l'efficienza La programmazione strutturata aiuta anche il programmatore a ridurre i tempi di codifica e organizzare il codice correttamente.
La programmazione strutturata stabilisce la modalità di codifica del programma. La programmazione strutturata utilizza tre concetti principali:
Top-down analysis- Un software è sempre fatto per eseguire un lavoro razionale. Questo lavoro razionale è noto come problema nel linguaggio del software. Quindi è molto importante capire come risolvere il problema. Sotto l'analisi top-down, il problema è suddiviso in piccoli pezzi in cui ognuno ha un significato. Ogni problema viene risolto individualmente e i passaggi sono chiaramente indicati su come risolvere il problema.
Modular Programming- Durante la programmazione, il codice viene suddiviso in un gruppo più piccolo di istruzioni. Questi gruppi sono noti come moduli, sottoprogrammi o subroutine. Programmazione modulare basata sulla comprensione dell'analisi top-down. Scoraggia i salti usando le istruzioni "goto" nel programma, il che spesso rende il flusso del programma non tracciabile. I salti sono proibiti e il formato modulare è incoraggiato nella programmazione strutturata.
Structured Coding - In riferimento all'analisi top-down, la codifica strutturata suddivide i moduli in ulteriori unità di codice più piccole nell'ordine di esecuzione. La programmazione strutturata utilizza la struttura di controllo, che controlla il flusso del programma, mentre la codifica strutturata utilizza la struttura di controllo per organizzare le sue istruzioni in modelli definibili.
Programmazione funzionale
La programmazione funzionale è lo stile del linguaggio di programmazione, che utilizza i concetti delle funzioni matematiche. Una funzione in matematica dovrebbe sempre produrre lo stesso risultato quando riceve lo stesso argomento. Nei linguaggi procedurali, il flusso del programma scorre attraverso le procedure, cioè il controllo del programma viene trasferito alla procedura chiamata. Durante il trasferimento del flusso di controllo da una procedura all'altra, il programma cambia il proprio stato.
Nella programmazione procedurale, è possibile che una procedura produca risultati diversi quando viene chiamata con lo stesso argomento, poiché il programma stesso può trovarsi in uno stato diverso durante la chiamata. Questa è una proprietà oltre che uno svantaggio della programmazione procedurale, in cui la sequenza o la tempistica dell'esecuzione della procedura diventa importante.
La programmazione funzionale fornisce mezzi di calcolo come funzioni matematiche, che producono risultati indipendentemente dallo stato del programma. Ciò consente di prevedere il comportamento del programma.
La programmazione funzionale utilizza i seguenti concetti:
First class and High-order functions - Queste funzioni hanno la capacità di accettare un'altra funzione come argomento o restituiscono altre funzioni come risultati.
Pure functions - Queste funzioni non includono aggiornamenti distruttivi, cioè non influenzano alcun I / O o memoria e se non sono in uso, possono essere facilmente rimosse senza ostacolare il resto del programma.
Recursion- La ricorsione è una tecnica di programmazione in cui una funzione chiama se stessa e ripete il codice del programma al suo interno a meno che una condizione predefinita non corrisponda. La ricorsione è il modo di creare cicli nella programmazione funzionale.
Strict evaluation- È un metodo per valutare l'espressione passata a una funzione come argomento. La programmazione funzionale ha due tipi di metodi di valutazione, rigoroso (desideroso) o non rigoroso (pigro). Una valutazione rigorosa valuta sempre l'espressione prima di invocare la funzione. La valutazione non rigorosa non valuta l'espressione a meno che non sia necessaria.
λ-calculus- La maggior parte dei linguaggi di programmazione funzionale utilizza λ-calcolo come sistema di tipi. Le espressioni λ vengono eseguite valutandole man mano che si verificano.
Common Lisp, Scala, Haskell, Erlang e F # sono alcuni esempi di linguaggi di programmazione funzionali.
Stile di programmazione
Lo stile di programmazione è un insieme di regole di codifica seguite da tutti i programmatori per scrivere il codice. Quando più programmatori lavorano sullo stesso progetto software, spesso devono lavorare con il codice del programma scritto da qualche altro sviluppatore. Questo diventa noioso o talvolta impossibile, se tutti gli sviluppatori non seguono uno stile di programmazione standard per codificare il programma.
Uno stile di programmazione appropriato include l'uso di nomi di funzioni e variabili rilevanti per l'attività prevista, l'uso di rientri ben posizionati, commenti di codice per comodità del lettore e presentazione generale del codice. Ciò rende il codice del programma leggibile e comprensibile da tutti, il che a sua volta semplifica il debug e la risoluzione degli errori. Inoltre, un corretto stile di codifica aiuta a facilitare la documentazione e l'aggiornamento.
Linee guida per la codifica
La pratica dello stile di codifica varia a seconda delle organizzazioni, dei sistemi operativi e del linguaggio di codifica stesso.
I seguenti elementi di codifica possono essere definiti nelle linee guida di codifica di un'organizzazione:
Naming conventions - Questa sezione definisce come denominare funzioni, variabili, costanti e variabili globali.
Indenting - Questo è lo spazio lasciato all'inizio della riga, di solito 2-8 spazi bianchi o una singola scheda.
Whitespace - Viene generalmente omesso alla fine della riga.
Operators- Definisce le regole di scrittura degli operatori matematici, di assegnazione e logici. Ad esempio, l'operatore di assegnazione "=" deve contenere uno spazio prima e dopo, come in "x = 2".
Control Structures - Le regole per scrivere if-then-else, case-switch, while-until e per le istruzioni del flusso di controllo esclusivamente e in modo annidato.
Line length and wrapping- Definisce quanti caratteri devono essere presenti in una riga, principalmente una riga è lunga 80 caratteri. Il wrapping definisce il modo in cui una riga deve essere mandata a capo, se è troppo lunga.
Functions - Definisce come le funzioni devono essere dichiarate e invocate, con e senza parametri.
Variables - Indica come vengono dichiarate e definite variabili di diversi tipi di dati.
Comments- Questo è uno dei componenti di codifica importanti, poiché i commenti inclusi nel codice descrivono ciò che il codice fa effettivamente e tutte le altre descrizioni associate. Questa sezione aiuta anche a creare documentazioni di aiuto per altri sviluppatori.
Documentazione software
La documentazione del software è una parte importante del processo del software. Un documento ben scritto fornisce un ottimo strumento e mezzo di archivio di informazioni necessarie per conoscere il processo del software. La documentazione del software fornisce anche informazioni su come utilizzare il prodotto.
Una documentazione ben conservata dovrebbe comprendere i seguenti documenti:
Requirement documentation - Questa documentazione funziona come strumento chiave per il progettista, lo sviluppatore e il team di test del software per svolgere le rispettive attività. Questo documento contiene tutte le descrizioni funzionali, non funzionali e comportamentali del software previsto.
La fonte di questo documento possono essere dati precedentemente memorizzati sul software, software già in esecuzione presso il cliente, interviste, questionari e ricerche del cliente. Generalmente viene archiviato sotto forma di foglio di calcolo o documento di elaborazione testi presso il team di gestione del software di fascia alta.
Questa documentazione funge da base per il software da sviluppare e viene utilizzata principalmente nelle fasi di verifica e convalida. La maggior parte dei casi di test vengono creati direttamente dalla documentazione dei requisiti.
Software Design documentation - Queste documentazioni contengono tutte le informazioni necessarie, che sono necessarie per costruire il software. Contiene:(a) Architettura software di alto livello, (b) Dettagli di progettazione del software, (c) Diagrammi di flusso dei dati, (d) Progettazione di database
Questi documenti funzionano come repository per gli sviluppatori per implementare il software. Sebbene questi documenti non forniscano alcun dettaglio su come codificare il programma, forniscono tutte le informazioni necessarie per la codifica e l'implementazione.
Technical documentation- Queste documentazioni sono mantenute dagli sviluppatori e dai programmatori effettivi. Questi documenti, nel loro insieme, rappresentano informazioni sul codice. Durante la scrittura del codice, i programmatori menzionano anche l'obiettivo del codice, chi lo ha scritto, dove sarà richiesto, cosa fa e come fa, quali altre risorse utilizza il codice, ecc.
La documentazione tecnica aumenta la comprensione tra i vari programmatori che lavorano sullo stesso codice. Migliora la capacità di riutilizzo del codice. Rende il debug facile e tracciabile.
Sono disponibili vari strumenti automatici e alcuni vengono forniti con il linguaggio di programmazione stesso. Ad esempio Java arriva lo strumento JavaDoc per generare la documentazione tecnica del codice.
User documentation- Questa documentazione è diversa da quanto spiegato sopra. Tutte le documentazioni precedenti vengono mantenute per fornire informazioni sul software e sul suo processo di sviluppo. Ma la documentazione per l'utente spiega come dovrebbe funzionare il prodotto software e come dovrebbe essere utilizzato per ottenere i risultati desiderati.
Queste documentazioni possono includere procedure di installazione del software, guide pratiche, guide per l'utente, metodi di disinstallazione e riferimenti speciali per ottenere maggiori informazioni come l'aggiornamento della licenza, ecc.
Sfide di implementazione del software
Ci sono alcune sfide affrontate dal team di sviluppo durante l'implementazione del software. Alcuni di loro sono menzionati di seguito:
Code-reuse- Le interfacce di programmazione dei linguaggi odierni sono molto sofisticate e sono dotate di enormi funzioni di libreria. Tuttavia, per ridurre il costo del prodotto finale, la direzione dell'organizzazione preferisce riutilizzare il codice, che è stato creato in precedenza per alcuni altri software. Ci sono enormi problemi che i programmatori devono affrontare per i controlli di compatibilità e per decidere quanto codice riutilizzare.
Version Management- Ogni volta che viene rilasciato un nuovo software al cliente, gli sviluppatori devono mantenere la documentazione relativa alla versione e alla configurazione. Questa documentazione deve essere estremamente accurata e disponibile in tempo.
Target-Host- Il programma software, che è in fase di sviluppo nell'organizzazione, deve essere progettato per le macchine host presso i clienti. Ma a volte è impossibile progettare un software che funzioni sulle macchine target.