Sobes.tech
Junior

Какво означава буквата 'O' в патърна SOLID?

sobes.tech AI

Отговор от AI

'O' означава Принцип на отвореност/затвореност (Open/Closed Principle).

Модулите (класове, функции и т.н.) трябва да са отворени за разширяване, но затворени за модификация. Това означава, че можете да добавяте нова функционалност, без да променяте съществуващия код.

Пример за нарушение на принципа:

// Пакет 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"
}

// Пакет calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Необходимо да се промени този код при добавяне на нова фигура
		case "rectangle":
			// Логика за изчисляване на площта на правоъгълника
		case "circle":
			// Логика за изчисляване на площта на кръга
		}
	}
	return totalArea
}

При добавяне на нова фигура (например, Триъгълник), ще е необходимо да се модифицира функцията CalculateArea в AreaCalculator за обработка на новия тип.

Пример за спазване на принципа:

// Пакет shape
type Shape interface {
	Area() float64 // Добавяме метода Area() към интерфейса
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // Логиката за изчисляване на площта е капсулирана в структурата
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // Логиката за изчисляване на площта е капсулирана в структурата
}

// Пакет calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Използваме полиморфизъм, без да знаем конкретния тип на фигурата
	}
	return totalArea
}

В този пример, добавянето на нова фигура, която реализира интерфейса Shape с метода Area(), не изисква промяна в кода в AreaCalculator. AreaCalculator е отворен за разширение (добавяне на нови типове Shape), но затворен за модификация (не изисква промени при добавяне на нови типове).

Това се постига чрез използването на полиморфизъм и капсулиране на логиката за изчисляване на площта във всеки тип фигура. Този принцип насърчава създаването на по-гъвкав, поддържан и разширяем код.