# Riuso di codice

In informatica con il termine riuso di codice si intende la pratica, estremamente comune nella programmazione, di richiamare o invocare parti di codice precedentemente già scritte ogni qualvolta risulta necessario, senza doverle riscrivere daccapo.

## Descrizione

Questo essenzialmente si concretizza nella scrittura di funzioni che possono essere richiamate o invocate all'interno di uno stesso programma, o raggruppate all'interno di librerie che possono essere a loro volta "collegate" su necessità all'interno dei vari programmi oppure nelle API. Nella pratica della programmazione ad oggetti, ad essere in qualche modo "richiamate", "importate" o "ereditate" sono le classi, sempre su necessità, ed eventualmente "estese" con nuove funzioni o metodi all'interno del programma stesso.
Il riuso di codice permette dunque un risparmio notevole nei tempi di scrittura di un programma da parte del programmatore, facilitando il lavoro di programmazione e migliorando la leggibilità del codice divenuto più corto e sintetico, ed è per questo presente in quasi tutti i linguaggi di programmazione, di cui rappresenta un'evoluzione già nelle primissime tecniche di programmazione, anche se obbliga in qualche modo il programmatore alla conoscenza delle varie librerie e funzioni disponibili o delle API.

## Tipi di riuso

Il riuso può essere:
* Opportunistico: mentre si prepara per iniziare un progetto, il team si rende conto che esistono componenti esistenti che possono essere riutilizzati.
* Pianificato: un team progetta strategicamente i componenti in modo che siano riutilizzabili in progetti futuri.
Il riuso può essere ulteriormente classificato:
* Interno: un team riutilizza i propri componenti. Questa potrebbe essere una decisione aziendale, poiché il team potrebbe voler controllare un componente critico per il progetto.
* Esterno: un team può scegliere di concedere in licenza un componente di terze parti. La concessione in licenza di un componente di terze parti in genere costa al team dall'1 al 20 percento di quanto costerebbe sviluppare internamente. Il team deve anche considerare il tempo necessario per trovare, apprendere e integrare il componente.
Per quanto riguarda la forma o la struttura del riuso, il codice può essere:
* Riferimento: il codice client contiene un riferimento al codice riutilizzato, pertanto hanno cicli di vita distinti e possono avere versioni distinte.
* Forked: il codice client contiene una copia locale o privata del codice riutilizzato e quindi condivide un singolo ciclo di vita e un'unica versione.

## Riuso sistematico

Il riuso sistematico del software è una strategia per aumentare la produttività e migliorare la qualità dell'industria del software. Sebbene sia semplice nel concetto, l'implementazione di successo del riutilizzo del software è difficile nella pratica. Una ragione addotta per questo è la dipendenza del riutilizzo del software dal contesto in cui è implementato. Alcuni problemi che devono essere affrontati in relazione al riuso sistematico del software sono:
* una visione del prodotto chiara e ben definita è una base essenziale per una linea di prodotti software (SPL).
* una strategia di implementazione evolutiva sarebbe una strategia più pragmatica per l'azienda.
* esiste la necessità di un supporto di gestione e leadership continui per garantire il successo.
* è necessaria una struttura organizzativa adeguata per supportare l'ingegneria SPL.
* il cambiamento di mentalità da un'azienda incentrata sul progetto a un'azienda orientata al prodotto è essenziale.
* Leadership manageriale a lungo termine
* Organizzazione sistematica e incrementale e cambiamento di processo
* Progettazione per il riutilizzo architettato e specifico del dominio
* Separazione: creare/supportare/utilizzare
* Capire che gli oggetti da soli non sono sufficienti
* Avviare piccole sperimentazioni e successivamente ampliarle
* Affrontare la cultura, l'esperienza e la stabilità dell'organizzazione
* Investire in infrastrutture, supporto e formazione
* Trovare campioni di riuso dedicati

## Campi di impiego
### Librerie software

Un esempio molto comune di riutilizzo del codice è la tecnica di utilizzo di una libreria software. Di seguito un esempio di codice riusabile della libreria JQuery:

### Modelli di progettazione

Un "design pattern" o "modello di progettazione" è una soluzione generale a un problema ricorrente. I modelli di progettazione sono più concettuali che tangibili e possono essere modificati per soddisfare l'esatta esigenza. Tuttavia, classi e interfacce astratte possono essere riutilizzate per implementare determinati modelli. Di seguito un esempio di design pattern riusabile:

### Funzione di ordine superiore

Nella programmazione funzionale le funzioni di ordine superiore possono essere utilizzate in molti casi in cui in precedenza venivano utilizzati design pattern o framework. Di seguito un esempio con Julia:

### Retrocomputing

Il retrocomputing comprende il riutilizzo del codice, semplicemente perché i programmi retrò vengono eseguiti su computer più vecchi o emulatori per essi.

### Sicurezza informatica

Nella sicurezza informatica il riutilizzo del codice è impiegato come metodo di exploit del software. Quando un utente malintenzionato non è in grado di inserire direttamente il codice per modificare il flusso di controllo di un programma, ad esempio in presenza di difese da iniezione di codice come W ^ X, può reindirizzare il flusso di controllo a sequenze di codice esistenti in memoria.

### Componenti

Un componente, in una misura orientata agli oggetti, rappresenta un insieme di classi collaborative (o solo una classe) e le sue interfacce. Le interfacce sono responsabili dell'abilitazione alla sostituzione dei componenti. I componenti riutilizzabili possono anche essere isolati e sincronizzati tra i repository SCM utilizzando le tecnologie di gestione del codice sorgente dei componenti (CSCM). Di seguito un esempio di componente riusabile:

### Computer esterni

L'intero concetto di "riutilizzo del codice" può comprendere anche applicazioni di ingegneria al di fuori del software. Ad esempio, la modellazione parametrica nella progettazione assistita da computer consente di creare progetti riutilizzabili.

## Esempi di riuso di codice

La maggior parte del codice HTML, CSS e (se presente) JS di una pagina web può essere riusato per creare più pagine web con contenuti diversi ma aventi lo stesso layout o un layout molto simile.
Di seguito una porzione di codice riusabile HTML 5 della pagina mostrata nell'immagine.
Anche nel caso di SVG e WebGL/Canvas può essere riusato parte dello stesso codice per creare progetti diversi:
Codice SVG riusato per creare il cerchio la seconda volta
Codice Canvas riusato per creare il cerchio la seconda volta