Sobes.tech
Junior

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.