Saltar al contenido principal

Open/Closed Principle (OCP)

Definición: Las entidades de software deben estar abiertas para su extensión, pero cerradas para su modificación. Code Smell Relacionado:

  • Switch Statements Excesivos
  • Condicionales Complejos
  • Modificaciones Frecuentes

Técnicas de Refactorización:

  • Replace Conditional with Polymorphism: Sustituir switches o if/else por jerarquías de clases
  • Strategy Pattern: Encapsular algoritmos en clases separadas
  • Template Method Pattern: Definir el esqueleto de un algoritmo y permitir que las subclases redefinan ciertos pasos
enum class ShapeType { CIRCLE, RECTANGLE, TRIANGLE }

class Shape(val type: ShapeType, val dimensions: Map<String, Double>)

class AreaCalculator {
fun calculateArea(shape: Shape): Double {
return when (shape.type) {
ShapeType.CIRCLE -> Math.PI * shape.dimensions["radius"]!! * shape.dimensions["radius"]!!
ShapeType.RECTANGLE -> shape.dimensions["width"]!! * shape.dimensions["height"]!!
ShapeType.TRIANGLE -> 0.5 * shape.dimensions["base"]!! * shape.dimensions["height"]!!
}
}
}
interface Shape {
fun calculateArea(): Double
}

class Circle(val radius: Double) : Shape {
override fun calculateArea(): Double = Math.PI * radius * radius
}

class Rectangle(val width: Double, val height: Double) : Shape {
override fun calculateArea(): Double = width * height
}

class Triangle(val base: Double, val height: Double) : Shape {
override fun calculateArea(): Double = 0.5 * base * height
}