Sobes.tech
Junior

Co znamená písmeno 'O' v vzoru SOLID?

sobes.tech AI

Odpověď od AI

'O' znamená Princip otevřenosti/zavřenosti (Open/Closed Principle).

Moduly (třídy, funkce atd.) by měly být otevřené pro rozšíření, ale uzavřené pro změnu. To znamená, že lze přidávat novou funkcionalitu, aniž bychom měnili stávající kód.

Příklad porušení principu:

// balíček 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íček calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Je nutné upravit tento kód při přidání nového tvaru
		case "rectangle":
			// Logika výpočtu plochy obdélníku
		case "circle":
			// Logika výpočtu plochy kruhu
		}
	}
	return totalArea
}

Při přidání nového tvaru (například, Trojúhelník), bude nutné upravit funkci CalculateArea v AreaCalculator pro zpracování nového typu.

Příklad dodržení principu:

// balíček shape
type Shape interface {
	Area() float64 // Přidáváme metodu Area() do rozhraní
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // Logika výpočtu plochy je enkapsulována ve struktuře
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // Logika výpočtu plochy je enkapsulována ve struktuře
}

// balíček calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Používáme polymorfismus, aniž bychom znali konkrétní typ tvaru
	}
	return totalArea
}

V tomto příkladu, přidání nového tvaru, který implementuje rozhraní Shape s metodou Area(), nevyžaduje změnu kódu v AreaCalculator. AreaCalculator je otevřený pro rozšíření (přidání nových typů Shape), ale uzavřený pro změny (nevyžaduje změny při přidání nových typů).

To je dosaženo pomocí použití polymorfismu a enkapsulace logiky výpočtu plochy uvnitř každého typu tvaru. Tento princip podporuje tvorbu flexibilnějšího, udržovatelného a rozšiřitelného kódu.