Sobes.tech
Junior

¿Qué significa la letra 'O' en el patrón SOLID?

sobes.tech AI

Respuesta de la IA

'O' significa Principio Abierto/Cerrado (Open/Closed Principle).

Los módulos (clases, funciones, etc.) deben estar abiertos para la extensión, pero cerrados para la modificación. Esto significa que se puede agregar nueva funcionalidad sin cambiar el código existente.

Ejemplo de violación del principio:

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

// Paquete calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		switch shape.Type() { // Es necesario modificar este código al agregar una nueva figura
		case "rectangle":
			// Lógica para calcular el área del rectángulo
		case "circle":
			// Lógica para calcular el área del círculo
		}
	}
	return totalArea
}

Al agregar una nueva figura (por ejemplo, Triángulo), sería necesario modificar la función CalculateArea en AreaCalculator para manejar el nuevo tipo.

Ejemplo de cumplimiento del principio:

// Paquete shape
type Shape interface {
	Area() float64 // Añadimos el método Area() a la interfaz
}

type Rectangle struct {
	Width, Height float64
}

func (r Rectangle) Area() float64 {
	return r.Width * r.Height // La lógica de cálculo del área está encapsulada en la estructura
}

type Circle struct {
	Radius float64
}

func (c Circle) Area() float64 {
	return 3.14 * c.Radius * c.Radius // La lógica de cálculo del área está encapsulada en la estructura
}

// Paquete calculator
type AreaCalculator struct{}

func (ac AreaCalculator) CalculateArea(shapes []Shape) float64 {
	totalArea := 0.0
	for _, shape := range shapes {
		totalArea += shape.Area() // Usamos polimorfismo, sin conocer el tipo específico de la figura
	}
	return totalArea
}

En este ejemplo, agregar una nueva figura que implemente la interfaz Shape con el método Area(), no requiere modificar el código en AreaCalculator. AreaCalculator está abierto para la extensión (añadir nuevos tipos Shape), pero cerrado para la modificación (no requiere cambios al agregar nuevos tipos).

Esto se logra mediante el uso de polimorfismo y encapsulación de la lógica de cálculo del área dentro de cada tipo de figura. El principio fomenta la creación de un código más flexible, mantenible y extensible.