Vai al contenuto
Home > Dieci paradigmi di programmazione: diversi modi di pensare i linguaggi

Dieci paradigmi di programmazione: diversi modi di pensare i linguaggi

Nel mondo della programmazione, esistono vari “modi di pensare” su come sviluppare software. Questi modi sono spesso chiamati “paradigmi di programmazione”. Scopriamo insieme dieci dei principali paradigmi e come questi influenzano il modo in cui scriviamo codice.

1. Procedurale

Nella programmazione procedurale, i programmi sono strutturati come una serie di procedure o funzioni. Ogni funzione svolge un compito specifico e può chiamare altre funzioni.

Esempio: in questo semplice programma C, abbiamo una funzione chiamata saluta che esegue un comando per stampare “Ciao, mondo!” sulla console. Il programma chiama la funzione saluta dal punto d’ingresso main, dimostrando una tipica struttura procedurale dove le funzioni si occupano di compiti specifici.

linguaggio c esempio

2. Ad Oggetti (Object-Oriented, OO)

Questo paradigma organizza il software attorno a “oggetti”, che contengono sia dati che comportamenti. Promuove il concetto di incapsulamento, ereditarietà e polimorfismo.

Esempio: qui abbiamo una classe Java Persona con un campo dati nome e un metodo saluta. La classe ha un costruttore che accetta una stringa e la assegna a nome. Il metodo saluta stampa un messaggio personalizzato utilizzando il valore di nome. Questo è un esempio di incapsulamento nella programmazione orientata agli oggetti.

java

3. Funzionale

La programmazione funzionale si concentra sull’invocazione di funzioni. Evita dati mutabili ed effetti collaterali, promuovendo la composizione di funzioni.

Esempio: in Haskell, questo è un esempio di una funzione ricorsiva che calcola la somma degli elementi di una lista. La funzione somma viene definita per una lista vuota (restituendo 0) e una lista non vuota. Nel secondo caso, aggiunge il primo elemento (x) al risultato della chiamata ricorsiva su ciò che resta della lista (xs).

esempio haskell

4. Logica

Si basa sulla logica matematica. I programmi esprimono fatti e regole, e le query sono risolte attraverso inferenza.

Esempio: questo frammento in Prolog definisce un fatto, indicando che antonio è padre di mario, e una regola che implica che se Y è padre di X, allora X è figlio di Y. Prolog utilizza queste definizioni per inferire relazioni e rispondere a query.

prolog esempio

5. Concorrente

Permette di eseguire calcoli in modo simultaneo, utilizzando più thread o processi.

Esempio: questo snippet in Erlang definisce un modulo con una funzione saluta. Sebbene questo specifico esempio non mostri concorrenza, Erlang è progettato per supportare operazioni concorrenti, e funzioni come saluta potrebbero essere eseguite concorrentemente in processi separati.

erlang esempio

6. Event-Driven (Basata sugli eventi)

Il flusso del programma è determinato dagli eventi, come input dell’utente o segnali da altri programmi.

Esempio: questo codice JavaScript è un esempio classico di programmazione basata sugli eventi. Aggiunge un gestore di eventi a un elemento del documento (in questo caso, un bottone). Quando l’utente fa clic sul bottone, viene eseguita la funzione di callback che attiva un alert.

javascript esempio

7. Declarativa

Si concentra su “cosa” fare, piuttosto che “come” farlo. SQL è un esempio, dove dichiariamo ciò che vogliamo dal database senza specificare come ottenerlo.

Esempio: questo comando SQL richiede al database di recuperare i nomi dalle righe della tabella persone dove l’età è superiore a 20. È un approccio dichiarativo perché specifica cosa vogliamo ottenere, non come ottenerlo.

esempio sql

8. Component-Based

Lo sviluppo è centrato su componenti riutilizzabili, che possono essere assemblati per creare applicazioni.

Esempio: in questo snippet di React (JSX), definiamo un componente funzionale che accetta delle props e restituisce del codice HTML. Il componente può essere riutilizzato e composto, essendo una parte fondamentale della programmazione basata sui componenti.

react esempio

9. Aspect-Oriented

Incapsula comportamenti trasversali, come il logging o la sicurezza, separati dalla logica principale del programma.

Esempio: considera un “aspect” che registra automaticamente ogni volta che viene chiamata una funzione specifica. Immaginiamo che tu stia utilizzando un framework come Spring in Java, e desideri registrare automaticamente ogni volta che una particolare funzione viene chiamata. Potresti utilizzare un “aspect” per fare ciò, come in questo frammento di codice che definisce un “aspect” di registrazione. Utilizza le annotazioni di Spring AOP per definire quando e dove intercettare il normale flusso di esecuzione del programma. L’annotazione @Before dice al framework di eseguire il metodo logBefore prima dell’esecuzione di ogni metodo nel package com.example.YourService. In pratica, ogni volta che si chiama un metodo di YourService, il sistema prima stampa il nome del metodo, grazie all’intercettazione di questo “aspect”.

aspect oriented esempio

10. Visual

La programmazione avviene attraverso la manipolazione di elementi grafici piuttosto che scrivendo codice testuale; il codice viene rappresentato come blocchi che possono essere trascinati e collegati insieme.

Esempio: immagina che tu abbia un personaggio (sprite) in Scratch chiamato “Gatto”. Desideri che ogni volta che clicchi sul Gatto, esso dica “Ciao!” per 2 secondi. In Scratch, combinerebbe i seguenti blocchi:

scratch esempio

Multiparadigma

La scelta del paradigma di programmazione dipende dal problema che si sta cercando di risolvere e dalle preferenze personali. Mentre alcuni paradigmi sono più adatti per certi tipi di applicazioni, la comprensione di vari paradigmi può arricchire il toolkit di ogni sviluppatore. Ogni paradigma offre un diverso modo di vedere e affrontare i problemi, e comprendere la loro natura e le loro forze può aiutare ad identificare la migliore soluzione in ogni situazione.

Inoltre, nel mondo della programmazione moderna, non è raro vedere la combinazione di più paradigmi all’interno dello stesso progetto. Un esempio notevole è il linguaggio Scala, che fonde i paradigmi della programmazione funzionale e orientata agli oggetti, offrendo agli sviluppatori la flessibilità di sfruttare il meglio di entrambi i mondi. Questo approccio ibrido può sfruttare i vantaggi di ciascun paradigma, fornendo flessibilità e potenza nella progettazione e nell’implementazione del software.

Dunque, non si tratta solo di scegliere il “miglior” paradigma, ma piuttosto di avere la saggezza e la capacità di scegliere o combinare i paradigmi più adatti alle specifiche esigenze del progetto.