Nel Laboratorio di Scienze e Tecnologie Informatiche (LSTI) è fondamentale avere una conoscenza dei paradigmi di programmazione, perché questi rappresentano i diversi modi di pensare e strutturare un programma. Vediamo una panoramica chiara dei principali paradigmi e di cosa è importante conoscere per ciascuno:
1. Paradigma Imperativo.
- Descrizione: Si basa su istruzioni che modificano lo stato del programma tramite variabili e assegnazioni.
- Caratteristiche principali:
- Sequenza di comandi che il computer esegue passo passo.
- Uso di variabili, cicli (for, while) e strutture condizionali (if).
- Linguaggi tipici: C, Pascal, Python (anche multi-paradigma).
- Cosa devi sapere: come scrivere procedure e funzioni, manipolare variabili, gestire il flusso del programma.
2. Paradigma Orientato agli Oggetti (OO).
- Descrizione: Organizza il codice attorno a oggetti, che combinano dati e comportamenti (metodi).
- Caratteristiche principali:
- Classi e oggetti.
- Incapsulamento, ereditarietà, polimorfismo.
- Linguaggi tipici: Java, C++, Python.
- Cosa devi sapere: creare classi e oggetti, definire metodi, comprendere i concetti di ereditarietà e polimorfismo.
3. Paradigma Funzionale.
- Descrizione: Si concentra sulle funzioni matematiche pure, evitando stati modificabili ed effetti collaterali.
- Caratteristiche principali:
- Funzioni come cittadini di prima classe.
- Composizione di funzioni.
- Ricorsione al posto di cicli.
- Linguaggi tipici: Haskell, Lisp, F#, anche Python o JavaScript supportano funzioni di ordine superiore.
- Cosa devi sapere: scrivere funzioni pure, usare map/filter/reduce, comprendere concetti come immutabilità.
4. Paradigma Logico/Dichiarativo.
- Descrizione: Si concentra sul cosa fare, non sul come farlo.
- Caratteristiche principali:
- Basato su regole e fatti logici.
- Esempio tipico: risolvere problemi tramite inferenze.
- Linguaggi tipici: Prolog.
- Cosa devi sapere: formulare problemi come relazioni logiche e query.
5. Paradigma Event-Driven (o a eventi).
- Descrizione: Il flusso del programma è determinato da eventi esterni (clic, messaggi, input).
- Caratteristiche principali:
- Gestione di eventi tramite listener o callback.
- Spesso usato nello sviluppo GUI e web.
- Linguaggi tipici: JavaScript, C# (GUI)
- Cosa devi sapere: capire come associare eventi a funzioni e gestire il flusso asincrono.
Consiglio pratico per il laboratorio: non serve diventare esperti di tutti i linguaggi, ma saper distinguere i paradigmi e riconoscere il loro approccio al problema è fondamentale. Molti esercizi del laboratorio richiedono di:
- scrivere codice in stile imperativo,
- progettare una classe (OO),
- usare funzioni in modo funzionale.
Ecco una tabella sintetica dei principali paradigmi di programmazione, con esempi pratici che puoi usare come ripasso rapido per il laboratorio di Scienze e Tecnologie Informatiche:
| Paradigma | Descrizione sinteticamente | Struttura principale / concetti | Esempio pratico (Python) |
| Imperativo | Istruzioni sequenziali che modificano lo stato | Variabili, cicli, condizionali | python\nsomma = 0\nfor i in range(1, 6):\n somma += i\nprint(somma) |
| Orientato agli oggetti (OO) | Organizza codice in oggetti con dati e comportamenti | Classi, oggetti, metodi, ereditarietà, polimorfismo | python\nclass Persona:\n def __init__(self, nome):\n self.nome = nome\n def saluta(self):\n print(“Ciao, sono ” + self.nome)\np = Persona(“Anna”)\np.saluta() |
| Funzionale | Funzioni pure, immutabilità, composizione | Funzioni di ordine superiore, map/filter/reduce, ricorsione | python\nnumeri = [1,2,3,4]\nsquared = list(map(lambda x: x**2, numeri))\nprint(squared) |
| Dichiarativo / Logico | Si specifica cosa fare, non come | Fatti, regole, query | prolog\ngenitore(anna, maria).\ngenitore(maria, luca).\nantenato(X,Y):- genitore(X,Y).\nantenato(X,Y):- genitore(X,Z), antenato(Z,Y). |
| Event-driven / a eventi | Flusso determinato da eventi esterni | Event listener, callback, gestione asincrona | python\n# esempio concettuale\ndef on_click():\n print(“Bottone cliccato”)\n# in una GUI: bottone.bind(“<Button-1>”, on_click) |
