Aplicación del Principio de Responsabilidad Única en C#

Clase 6 de 16Curso de Principios SOLID en C# y .NET

Resumen

¿Cómo aplicar el principio de responsabilidad única en el código?

Implementar el principio de responsabilidad única en el desarrollo de software es vital para la creación de sistemas mantenibles y escalables. Este principio, parte de los principios SOLID, establece que una clase debe tener una única razón para cambiar, es decir, debe tener sólo un propósito o responsabilidad. En consecuencia, el objetivo de este contenido es guiarte para aplicar este principio en un ejemplo práctico usando C#.

¿Qué problema presenta StudentRepository?

Antes de comenzar a aplicar cambios, es importante identificar los problemas existentes. En el caso de la clase StudentRepository, su cometido debería ser exclusivamente la gestión de los datos del modelo Student. Esto incluye acciones comunes como:

  • Obtener datos.
  • Insertar datos.
  • Actualizar datos.
  • Eliminar datos.

Sin embargo, se ha identificado un método en StudentRepository denominado Export, que realiza la tarea de exportar datos a un archivo CSV. Esto viola el principio de responsabilidad única, ya que la clase está asumiendo más responsabilidades de las que debería gestionar.

¿Cómo refactorizar para cumplir con el principio de responsabilidad única?

Creación de una clase específica para la exportación

Para resolver esta violación del principio, crearemos una nueva clase, ExportHelper, que se encargará específicamente de la lógica de exportación de los datos. De esta manera, liberamos a StudentRepository de una responsabilidad que no le corresponde:

public class ExportHelper
{
    public void ExportStudents(IEnumerable<Student> students)
    {
        // Lógica de exportación a CSV
        // ...
    }
}

Transferimos la lógica de exportación correspondiente desde StudentRepository a ExportHelper. Asimismo, al crear esta clase, nos aseguramos de seguir el principio de responsabilidad única, ya que cada clase permanece enfocada en una única función.

Ajuste en Program y ejecución

En la clase Program, eliminamos la referencia al método Export de StudentRepository y adaptamos el uso de ExportHelper para exportar los datos:

var studentRepository = new StudentRepository();
var students = studentRepository.GetAll();

var exportHelper = new ExportHelper();
exportHelper.ExportStudents(students);

Finalmente, al ejecutar nuestro código refactorizado, verificamos que siga funcionando según lo esperado, generando el archivo CSV, pero ahora respetando el principio de responsabilidad única.

¿Cómo podríamos mejorar aún más este diseño?

Un enfoque adicional para mejorar la flexibilidad y reutilización del código es el uso de genéricos en ExportHelper. Esto permitiría que ExportHelper maneje la exportación de diferentes tipos de datos, no solo Student, volviendo a la clase más adaptable y evitando redundancias.

Aquí tienes un rápido ejemplo de cómo podría comenzar la implementación genérica:

public class ExportHelper
{
    public void ExportData<T>(IEnumerable<T> data)
    {
        // Lógica genérica de exportación
        // ...
    }
}

En resumen, este ejemplo destaca la importancia del principio de responsabilidad única y cómo su aplicación adecuada refuerza la cohesión, facilita el mantenimiento del código y promueve el desarrollo estructurado y ordenado. Ahora es tu turno de continuar aprendiendo y aplicando estos principios en tus proyectos futuros. ¡Sigue adelante y no te detengas!