Sobes.tech
Junior

Cosa significa la lettera 'O' nel pattern SOLID?

sobes.tech AI

Risposta dell'AI

La 'O' rappresenta il Principio Aperto/Chiuso (Open/Closed Principle).

I moduli (classi, funzioni, ecc.) dovrebbero essere aperti all'estensione, ma chiusi alla modifica. Ciò significa che si può aggiungere nuova funzionalità senza modificare il codice esistente.

Esempio di violazione del principio:

// Pacchetto shape
type Shape interface {
	Type() string
}

type Rectangle struct{}

func (r Rectangle) Type() string {
	return "rectangle"
}

type Circle struct{}

func (c Circle) Type() string {
	return "circle"
}

// Pacchetto calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // È necessario modificare questo codice aggiungendo una nuova forma
		case "rectangle":
			// Logica di calcolo dell'area del rettangolo
		case "circle":
			// Logica di calcolo dell'area del cerchio
		}
	}
	return totalArea
}

Aggiungendo una nuova forma (ad esempio, Triangolo), sarebbe necessario modificare la funzione CalculateArea in AreaCalculator per gestire il nuovo tipo.

Esempio di rispetto del principio:

// Pacchetto shape
type Shape interface {
	Area() float64 // Aggiunta del metodo Area() all'interfaccia
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // La logica di calcolo dell'area è incapsulata nella struttura
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // La logica di calcolo dell'area è incapsulata nella struttura
}

// Pacchetto calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Si utilizza il polimorfismo, senza conoscere il tipo specifico della forma
	}
	return totalArea
}

In questo esempio, l'aggiunta di una nuova forma che implementa l'interfaccia Shape con il metodo Area(), non richiede modifiche al codice in AreaCalculator. AreaCalculator è aperto all'estensione (aggiunta di nuovi tipi Shape), ma chiuso alla modifica (non richiede modifiche al codice quando si aggiungono nuovi tipi).

Ciò è reso possibile grazie all'uso del polimorfismo e dell'incapsulamento della logica di calcolo dell'area all'interno di ogni tipo di forma. Questo principio favorisce la creazione di codice più flessibile, manutenibile ed estensibile.