martedì 21 gennaio 2025

Corso di Programmazione Strutturata e OOP: 2 introduzione alla programmazione ad oggetti (OOP)

👩‍💻 Oggetti, classi e metodi
 introduzione alla programmazione ad oggetti (OOP)

📌 Concetti chiave

🔹 Il paradigma a oggetti

La programmazione a oggetti (OOP, Object-Oriented Programming) è un paradigma che organizza il codice attorno a entità chiamate oggetti.
Un oggetto è un’astrazione del mondo reale che racchiude dati (stato) e comportamenti (azioni) in un’unica unità coerente.

👉 In altre parole, un oggetto può essere visto come una “cosa” autonoma capace di interagire con altre cose.


🔹 Perché la OOP

Rispetto al modello procedurale, in cui i dati e le funzioni sono separati, la OOP presenta diversi vantaggi:

  • Organizzazione → il codice è più leggibile e strutturato.
  • Riusabilità → le classi possono essere riutilizzate in più progetti.
  • Manutenibilità → è più facile aggiornare o correggere una parte del sistema senza stravolgere tutto il resto.
  • Astrazione → permette di modellare problemi complessi in modo naturale.

🔹 Procedurale vs OOP

Paradigma Procedurale Paradigma a Oggetti (OOP)
Dati e funzioni separati Dati e metodi integrati in oggetti
Programma come sequenza di istruzioni Programma come interazione tra oggetti
Riutilizzo limitato Elevato riutilizzo grazie a classi e ereditarietà

🔹 Classi e istanze

  • Una classe è un modello, una sorta di “stampo” per creare oggetti.
  • Un’istanza è un oggetto concreto creato da una classe.

Esempio:

class Animale:
    pass

cane = Animale()  # istanza della classe Animale

🔹 Attributi e metodi

  • Attributi → variabili che descrivono le caratteristiche di un oggetto.
  • Metodi → funzioni definite all’interno della classe, che descrivono i comportamenti dell’oggetto.

Esempio:

class Animale:
    def __init__(self, nome, specie, suono):
        self.nome = nome        # attributo
        self.specie = specie    # attributo
        self.suono = suono      # attributo

    def faiVerso(self):         # metodo
        return f"{self.nome} dice {self.suono}"

🧪 Attività pratiche

1️⃣ Classe Animale

Definisci una classe con attributi e metodi, poi crea diverse istanze.

class Animale:
    def __init__(self, nome, specie, suono):
        self.nome = nome
        self.specie = specie
        self.suono = suono

    def faiVerso(self):
        return f"{self.nome} ({self.specie}) dice: {self.suono}"

# istanze
cane = Animale("Fido", "Cane", "bau")
gatto = Animale("Micio", "Gatto", "miao")
mucca = Animale("Bianchina", "Mucca", "muu")

print(cane.faiVerso())
print(gatto.faiVerso())
print(mucca.faiVerso())

2️⃣ Interazione tra oggetti

Facciamo interagire due classi: Animale e Giocattolo.

class Giocattolo:
    def __init__(self, nome):
        self.nome = nome

    def usatoDa(self, animale):
        return f"{animale.nome} gioca con {self.nome}"

palla = Giocattolo("palla")
print(palla.usatoDa(cane))  # Fido gioca con palla

3️⃣ Mondo reale

Modelliamo un concetto più vicino alla vita quotidiana: Studente.

class Studente:
    def __init__(self, nome, eta, classe):
        self.nome = nome
        self.eta = eta
        self.classe = classe

    def studia(self, materia):
        return f"{self.nome} sta studiando {materia}"

    def sostieneEsame(self, materia):
        return f"{self.nome} ha sostenuto l’esame di {materia}"

alunno = Studente("Luca", 20, "3A")
print(alunno.studia("matematica"))
print(alunno.sostieneEsame("fisica"))

Altri esempi possibili:

  • Libro con titolo, autore, numero di pagine, metodo leggi().
  • ContoBancario con saldo, metodi deposita(), preleva().

🔍 Riflessione critica

La OOP non è solo una tecnica, ma un modo di pensare.
Modellare un sistema in termini di oggetti significa avvicinare la logica del software a quella del mondo reale. Tuttavia:

  • Non sempre è il paradigma migliore (per esempio, nei programmi molto semplici la OOP può risultare eccessiva).
  • Richiede disciplina e progettazione: una cattiva modellazione porta a codice complesso e difficile da mantenere.
  • È stata rivoluzionaria, ma oggi si combina con altri paradigmi (funzionale, reattivo, declarativo) per rispondere alla complessità crescente del software moderno.


📋 Test di verifica
1. Cosa rappresenta una classe nella OOP?
A) Una funzione specifica
B) Un tipo di dato primitivo
C) Un modello per creare oggetti ✅

2. Quale tra questi è un esempio di attributo?
A) studia()
B) nome
C) return

3. Quale tra queste è una differenza tra OOP e programmazione procedurale?
A) Nella OOP non esistono funzioni
B) La OOP separa dati e comportamenti
C) La OOP racchiude dati e metodi negli oggetti ✅

4. Se creo un oggetto “pippo = Animale('Pippo', 'Pappagallo', 'ciao')”, cosa rappresenta “pippo”?
A) Una classe
B) Un metodo
C) Un’istanza ✅

5. Cosa fa il metodo __init__?
A) È un costruttore, inizializza gli oggetti ✅
B) Elimina una classe
C) Chiude il programma

🔎 Risposte corrette: 1C – 2B – 3C – 4C – 5A 🎯 Obiettivo didattico:
Acquisire i concetti base della programmazione orientata agli oggetti attraverso esempi concreti, simulazioni ed esercizi. 💬 Suggerimento:
Per stimolare la riflessione, chiedi agli studenti di inventare una propria classe originale (es. Videogioco, Pianeta, Ingrediente) e mostrarne attributi e metodi in un disegno o schema.

Nessun commento:

Posta un commento

Corso Fondamenti di Informatica e Reti: 4 Architettura del computer

  ARCHITETTURA DEL COMPUTER come funziona davvero una macchina Capire un computer non significa solo saperlo accendere o aprire file: die...