Co oznacza litera 'O' w wzorcu SOLID?
sobes.tech AI
Odpowiedź od AI
'O' oznacza zasadę otwarte/zamknięte (Open/Closed Principle).
Moduły (klasy, funkcje itp.) powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje. Oznacza to, że można dodawać nową funkcjonalność bez zmieniania istniejącego kodu.
Przykład naruszenia zasady:
// Pakiet 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"
}
// Pakiet calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
switch shape.Type() { // Konieczne jest zmodyfikowanie tego kodu przy dodaniu nowego kształtu
case "rectangle":
// Logika obliczania pola prostokąta
case "circle":
// Logika obliczania pola koła
}
}
return totalArea
}
Dodając nowy kształt (np. Trójkąt), konieczne będzie zmodyfikowanie funkcji CalculateArea w AreaCalculator do obsługi nowego typu.
Przykład przestrzegania zasady:
// Pakiet shape
type Shape interface {
Area() float64 // Dodajemy metodę Area() do interfejsu
}
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height // Logika obliczania pola jest enkapsulowana w strukturze
}
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius // Logika obliczania pola jest enkapsulowana w strukturze
}
// Pakiet calculator
type AreaCalculator struct{}
func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
totalArea := 0.0
for _, shape := range shapes {
totalArea += shape.Area() // Używamy polimorfizmu, nie znając konkretnego typu kształtu
}
return totalArea
}
W tym przykładzie dodanie nowego kształtu implementującego interfejs Shape z metodą Area() nie wymaga zmiany kodu w AreaCalculator. AreaCalculator jest otwarty na rozszerzenia (dodanie nowych typów Shape), ale zamknięty na modyfikacje (nie wymaga zmian przy dodawaniu nowych typów).
Dzięki temu możliwe jest korzystanie z polimorfizmu i enkapsulacji logiki obliczania pola w każdym typie kształtu. Ten zasadniczy przyczynia się do tworzenia bardziej elastycznego, łatwego w utrzymaniu i rozszerzalnego kodu.