Sobes.tech
Junior
156
questionbank

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

Ответ от нейросети

sobes.tech 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
}

При добавлении новой фигуры (например, Triangle), потребуется модифицировать функцию 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), но закрыт для модификации (не требует изменения кода при добавлении новых типов).

Это достигается за счет использования полиморфизма и инкапсуляции логики расчета площади внутри каждого типа фигуры. Принцип способствует созданию более гибкого, поддерживаемого и расширяемого кода.