Aplicación del Principio de Abierto/Cerrado en Programación
Clase 8 de 16 • Curso de Principios SOLID en C# y .NET
Resumen
¿Cómo aplicar el principio de abierto y cerrado en programación?
Adoptar el principio de abierto y cerrado es crucial para el desarrollo de software flexible y sostenible. Este principio se centra en crear sistemas que puedan ampliarse con nuevas funcionalidades sin alterar el código existente. Usar este enfoque contribuye a la estabilidad, promoviendo un desarrollo evolutivo y minimizando el riesgo de introducir errores al modificar un software existente.
¿Cuál es el desafío inicial?
El desafío consiste en extender una base de código existente que ya cuenta con clases para empleados a tiempo completo y de medio tiempo. La tarea es agregar un tipo de empleado contratado, respetando el principio de abierto y cerrado. Esto implica diseñar un sistema que permita la adición de nuevos tipos de empleados o contratos sin modificar las clases ya existentes.
¿Cómo identificar la reutilización de código?
Analizar el escenario es clave. Al observar las clases existentes, notamos que todas se relacionan con empleados y su tipo de contrato, compartiendo propiedades similares. Identificar estas similitudes nos permite crear componentes genéricos que facilitan la reutilización. Un enfoque propuesto es la creación de una clase abstracta Employee
para establecer un estándar común.
¿Cómo estructurar las clases empleando la herencia?
Para optimizar nuestro sistema y alinear con el principio en cuestión, creamos una clase abstracta Employee
. Establecemos atributos básicos como fullName
y hoursWorked
, y definimos un método abstracto para el cálculo del salario. Luego, distintas clases como FullTimeEmployee
y PartTimeEmployee
heredan de Employee
, e implementan su lógica específica de cálculo de salario. Este método nos permite agregar nuevos tipos de empleados simplemente extendiendo Employee
sin modificar el código original.
public abstract class Employee {
public string FullName { get; set; }
public int HoursWorked { get; set; }
public abstract decimal CalculateSalary();
}
public class FullTimeEmployee : Employee {
public override decimal CalculateSalary() {
return HoursWorked * 20; // precio/hora ficticio para el cálculo
}
}
¿Cómo integrar nuevas funcionalidades sin romper el código?
Con nuestra estructura basada en clases abstractas, incorporar un nuevo tipo de empleado es sencillo. Creamos una clase nueva, como ContractorEmployee
, que hereda de Employee
, provee las implementaciones necesarias para sus métodos diferenciales, y dejamos que el sistema existente maneje las instancias de maneras ya previstas.
public class ContractorEmployee : Employee {
public override decimal CalculateSalary() {
return HoursWorked * 25; // precio/hora diferente
}
}
¿Qué aportan las buenas prácticas de programación?
La correcta implementación del principio de abierto y cerrado mejora notablemente la calidad del código. Evitamos modificar las clases existentes, lo que minimiza el riesgo de errores. Además, al usar una estructura bien definida, el sistema se mantiene organizado, promoviendo la responsabilidad única de cada clase. Este tipo de diseño es ejemplar de cómo aplicar técnicas sólidas para el crecimiento orgánico y sostenible de software. Estas prácticas no solo favorecen la extensión del código, sino también su comprensión y mantenimiento, aportando un valor duradero al proyecto.