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.