Sobes.tech
Junior

Mit jelent az 'O' betű a SOLID mintában?

sobes.tech MI

Válasz az MI-től

Az 'O' a Nyitott/Zárt Elv (Open/Closed Principle) jelentése.

A modulok (osztályok, függvények stb.) nyitottak legyenek a bővítésre, de zártak a módosításra. Ez azt jelenti, hogy új funkcionalitásokat lehet hozzáadni anélkül, hogy a meglévő kódot módosítanánk.

A szabály megsértésének példája:

// shape csomag
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"
}

// calculator csomag
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Ezt a kódot módosítani kell, ha új alakzatot adunk hozzá
		case "rectangle":
			// A téglalap területének kiszámítási logikája
		case "circle":
			// A kör területének kiszámítási logikája
		}
	}
	return totalArea
}

Új alakzat (pl. Háromszög) hozzáadásakor módosítani kell a CalculateArea függvényt, hogy kezelje az új típust.

A szabály betartásának példája:

// shape csomag
type Shape interface {
	Area() float64 // Az Area() metódus hozzáadása az interfészhez
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // A terület kiszámításának logikája a struktúrában van kapszulázva
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // A terület kiszámításának logikája a struktúrában van kapszulázva
}

// calculator csomag
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Polimorfizmust használunk, anélkül, hogy ismernénk a konkrét típusát
	}
	return totalArea
}

Ebben a példában, egy új Shape-et implementáló típus hozzáadása, amely rendelkezik az Area() metódussal, nem igényli a CalculateArea kód módosítását. A CalculateArea nyitott a bővítésre (új Shape típusok hozzáadása), de zárt a módosításra (nem igényel változtatást új típusok hozzáadásakor).

Ez a polimorfizmus és az inkapszuláció segítségével érhető el, ahol minden alakzat típusában kapszulázva van a terület számításának logikája. Ez az elv elősegíti a rugalmasabb, könnyen karbantartható és bővíthető kód kialakítását.