Sobes.tech
Junior

Čo znamená písmeno 'O' v vzoreci SOLID?

sobes.tech AI

Odpoveď od AI

'O' znamená princíp otvorenosti/zatvorenosti (Open/Closed Principle).

Moduly (triedy, funkcie atď.) by mali byť otvorené na rozšírenie, ale zatvorené na modifikáciu. To znamená, že je možné pridávať novú funkcionalitu bez zmeny existujúceho kódu.

Príklad porušenia princípu:

// Balík 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"
}

// Balík calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Je potrebné zmeniť tento kód pri pridávaní novej figúry
		case "rectangle":
			// Logika výpočtu plochy obdĺžnika
		case "circle":
			// Logika výpočtu plochy kruhu
		}
	}
	return totalArea
}

Pri pridávaní novej figúry (napríklad Triangle) bude potrebné upraviť funkciu CalculateArea v AreaCalculator na spracovanie nového typu.

Príklad dodržiavania princípu:

// Balík shape
type Shape interface {
	Area() float64 // Pridávame metódu Area() k rozhraniu
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // Logika výpočtu plochy je zakomponovaná v štruktúre
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // Logika výpočtu plochy je zakomponovaná v štruktúre
}

// Balík calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Používame polymorfizmus, nepoznajúc konkrétny typ figúry
	}
	return totalArea
}

V tomto príklade pridanie novej figúry, ktorá implementuje rozhranie Shape s metódou Area(), nevyžaduje zmenu kódu v AreaCalculator. AreaCalculator je otvorený na rozšírenie (pridanie nových typov Shape), ale zatvorený na modifikáciu (nevyžaduje zmenu kódu pri pridávaní nových typov).

Toto je dosiahnuté použitím polymorfizmu a enkapsulácie logiky výpočtu plochy v rámci každého typu figúry. Princíp prispieva k vytváraniu flexibilnejšieho, udržiavateľného a rozšíriteľného kódu.