Sobes.tech
Junior

Šta znači slovo 'O' u obrascu SOLID?

sobes.tech АИ

Одговор од АИ

'O' означava Princip otvorenosti/zatvorenosti (Open/Closed Principle).

Moduli (klase, funkcije itd.) treba da budu otvoreni za proširenje, ali zatvoreni za izmene. To znači da možete dodavati novu funkcionalnost bez menjanja postojećeg koda.

Primer kršenja principa:

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

// Paket calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Potreban je da se menja ovaj kod pri dodavanju nove figure
		case "rectangle":
			// Logika za računanje površine pravougaonika
		case "circle":
			// Logika za računanje površine kruga
		}
	}
	return totalArea
}

Dodavanjem nove figure (npr. Trougao), biće potrebno da se modifikuje funkcija CalculateArea u AreaCalculator za obradu novog tipa.

Primer poštovanja principa:

// Paket shape
type Shape interface {
	Area() float64 // Dodajemo metodu Area() u interfejs
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // Logika za računanje površine je enkapsulirana u strukturi
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // Logika za računanje površine je enkapsulirana u strukturi
}

// Paket calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Koristimo polimorfizam, ne znajući tačno koji je tip
	}
	return totalArea
}

U ovom primeru, dodavanje nove figure koja implementira interfejs Shape sa metodom Area(), ne zahteva promenu koda u AreaCalculator. AreaCalculator je otvoren za proširenje (dodavanje novih Shape tipova), ali zatvoren za modifikaciju (ne zahteva promene pri dodavanju novih tipova).

To se postiže korišćenjem polimorfizma i enkapsulacije logike računanja površine unutar svakog tipa figure. Ovaj princip podstiče kreiranje fleksibilnijeg, održivijeg i proširivijeg koda.