Menu
Coddy logo textTech

Metodi Getter e Setter

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 49 di 107.

Poiché i campi non esportati non possono essere acceduti direttamente dall'esterno di un pacchetto, devi fornire metodi che consentano un accesso controllato. Questi sono comunemente chiamati getter e setter.

In Go, la convenzione per i getter è semplice: usa il nome del campo con la prima lettera maiuscola. Non aggiungere il prefisso "Get", usa semplicemente Balance(), non GetBalance():

type BankAccount struct {
    balance int  // non esportato
}

// Getter - restituisce il valore
func (b *BankAccount) Balance() int {
    return b.balance
}

// Setter - modifica il valore con una convalida
func (b *BankAccount) SetBalance(amount int) {
    if amount >= 0 {
        b.balance = amount
    }
}

Il vero potere dei setter consiste nell’aggiungere convalide o logica di business. Invece di consentire al codice esterno di impostare direttamente qualsiasi valore, controlli cosa è consentito:

func (b *BankAccount) Deposit(amount int) bool {
    if amount <= 0 {
        return false
    }
    b.balance += amount
    return true
}

Questo metodo Deposit agisce come un setter specializzato che impone delle regole: non sono ammessi depositi negativi. Il codice esterno deve passare attraverso i tuoi metodi, assicurando che la struct rimanga sempre in uno stato valido. Questa è l’incapsulazione in azione: nascondere i dati esponendo al contempo un comportamento controllato.

challenge icon

Sfida

Facile

Costruiamo un convertitore di temperatura che dimostri il corretto incapsulamento usando metodi getter e setter. Creerai una struct che memorizza internamente la temperatura in Celsius, ma ne consente l'accesso controllato tramite metodi con convalida.

Organizzerai il codice in due file:

  • temperature.go: crea una struct Temperature con un campo celsius non esportato (float64). Implementa i seguenti metodi:
    • Celsius() - un getter che restituisce la temperatura attuale in Celsius
    • SetCelsius(value float64) - un setter che accetta solo valori pari o superiori allo zero assoluto (-273.15). Se il valore è inferiore a questa soglia, la temperatura deve rimanere invariata.
    • Fahrenheit() - restituisce la temperatura convertita in Fahrenheit usando la formula: (celsius * 9/5) + 32
    • SetFahrenheit(value float64) - converte l'input da Fahrenheit a Celsius e lo memorizza, ma solo se il valore Celsius risultante è pari o superiore a -273.15
    Aggiungi anche un costruttore NewTemperature(celsius float64) *Temperature che crea una temperatura inizializzata al valore specificato (assumi che l'input del costruttore sia valido).
  • main.go: leggi i valori della temperatura dall'input e mostra i metodi getter/setter. Crea una temperatura, visualizzane i valori in entrambe le unità, poi prova a impostare nuovi valori e mostra i risultati.

Verranno forniti i seguenti input:

  • Riga 1: valore iniziale in Celsius
  • Riga 2: nuovo valore Celsius da impostare
  • Riga 3: nuovo valore Fahrenheit da impostare

Formatta tutti i valori di temperatura con due cifre decimali. Stampa la seguente sequenza:

  1. Dopo la creazione: C: [celsius] F: [fahrenheit]
  2. Dopo aver impostato Celsius: C: [celsius] F: [fahrenheit]
  3. Dopo aver impostato Fahrenheit: C: [celsius] F: [fahrenheit]

Per esempio, dati 25, -300 e 212, l'output dovrebbe essere:

C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00

Nota che la seconda riga mostra valori invariati perché -300 è inferiore allo zero assoluto, quindi il setter lo ha rifiutato. La terza riga mostra la temperatura dopo aver impostato con successo 212°F (che viene convertito in 100°C). Questa è la potenza dei setter: applicano regole che mantengono validi i dati.

Provalo tu

package main

import (
	"fmt"
)

func main() {
	// Leggi i valori di input
	var initialCelsius float64
	var newCelsius float64
	var newFahrenheit float64
	fmt.Scanln(&initialCelsius)
	fmt.Scanln(&newCelsius)
	fmt.Scanln(&newFahrenheit)

	// TODO: Crea un nuovo oggetto Temperature usando il costruttore

	// TODO: Stampa i valori iniziali nel formato "C: [celsius] F: [fahrenheit]" con 2 cifre decimali

	// TODO: Prova a impostare il nuovo valore Celsius e stampa il risultato

	// TODO: Prova a impostare il nuovo valore Fahrenheit e stampa il risultato
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online