Sobes.tech
Junior

O que significa a letra 'O' no padrão SOLID?

sobes.tech IA

Resposta da IA

O' significa Princípio Aberto/Fechado (Open/Closed Principle).

Os módulos (classes, funções, etc.) devem estar abertos para extensão, mas fechados para modificação. Isso significa que é possível adicionar nova funcionalidade sem alterar o código existente.

Exemplo de violação do princípio:

// Pacote 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"
}

// Pacote calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // É necessário modificar este código ao adicionar uma nova figura
		case "rectangle":
			// Lógica de cálculo da área do retângulo
		case "circle":
			// Lógica de cálculo da área do círculo
		}
	}
	return totalArea
}

Ao adicionar uma nova figura (por exemplo, Triângulo), seria necessário modificar a função CalculateArea em AreaCalculator para lidar com o novo tipo.

Exemplo de cumprimento do princípio:

// Pacote shape
type Shape interface {
	Area() float64 // Adicionamos o método Area() à interface
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // A lógica de cálculo da área está encapsulada na estrutura
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // A lógica de cálculo da área está encapsulada na estrutura
}

// Pacote calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Usamos polimorfismo, sem conhecer o tipo específico da figura
	}
	return totalArea
}

Neste exemplo, adicionar uma nova figura que implemente a interface Shape com o método Area(), não requer alteração no código em AreaCalculator. AreaCalculator está aberto para extensão (adicionar novos tipos Shape), mas fechado para modificação (não requer mudanças ao adicionar novos tipos).

Isso é possível graças ao uso de polimorfismo e encapsulamento da lógica de cálculo da área dentro de cada tipo de figura. Este princípio promove a criação de um código mais flexível, de fácil manutenção e extensível.