Sobes.tech
Junior

Ce înseamnă litera 'O' în modelul SOLID?

sobes.tech AI

Răspuns de la AI

'O' reprezintă Principiul Deschis/Închis (Open/Closed Principle).

Modulele (clase, funcții etc.) trebuie să fie deschise pentru extindere, dar închise pentru modificare. Aceasta înseamnă că se poate adăuga funcționalitate nouă fără a modifica codul existent.

Exemplu de încălcare a principiului:

// Pachet 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"
}

// Pachet calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Este necesar să modifici acest cod la adăugarea unei noi forme
		case "rectangle":
			// Logica de calcul a ariei dreptunghiului
		case "circle":
			// Logica de calcul a ariei cercului
		}
	}
	return totalArea
}

Adăugând o nouă formă (de exemplu, Triunghi), va fi necesar să modifici funcția CalculateArea din AreaCalculator pentru a gestiona noul tip.

Exemplu de respectare a principiului:

// Pachet shape
type Shape interface {
	Area() float64 // Adăugăm metoda Area() la interfață
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // Logica de calcul a ariei este încapsulată în structură
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // Logica de calcul a ariei este încapsulată în structură
}

// Pachet calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Folosim polimorfismul, fără a cunoaște tipul specific al formei
	}
	return totalArea
}

În acest exemplu, adăugarea unei noi forme care implementează interfața Shape cu metoda Area(), nu necesită modificarea codului în AreaCalculator. AreaCalculator este deschis pentru extindere (adăugarea de noi tipuri Shape), dar închis pentru modificare (nu necesită schimbări la adăugarea de noi tipuri).

Acest lucru este posibil datorită utilizării polimorfismului și încapsulării logicii de calcul a ariei în fiecare tip de formă. Acest principiu promovează crearea unui cod mai flexibil, mai ușor de întreținut și extensibil.