Š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.