Principios SOLID en C#: teoría y práctica con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Principios SOLID en C#: teoría y práctica



SOLID es un acrónimo de cinco principios fundamentales de la programación orientada a objetos y el diseño, formulados por Robert Martin (Tío Bob). Estos principios ayudan a los desarrolladores a crear código flexible, mantenible y escalable. En este artículo analizaremos cada principio SOLID en lenguaje C# con ejemplos de código concretos.



1. Single Responsibility Principle (SRP) — Principio de responsabilidad única



Teoría: Cada clase debe tener una sola razón para cambiar. En otras palabras, la clase debe ser responsable de una tarea claramente definida.



Práctica en C#: Consideremos un ejemplo de violación de SRP y su corrección.



Violación de SRP:

public class OrderService{    public void CreateOrder(Order order)    {        // Lógica de creación de pedido        Console.WriteLine("Pedido creado");                // Lógica de envío de email        SendEmail("order@example.com", "Nuevo pedido");                // Lógica de registro        File.WriteAllText("log.txt", "Pedido creado");    }}


La clase OrderService es responsable de tres tareas diferentes: creación de pedidos, envío de emails y registro. Esto viola SRP.



Corrección cumpliendo SRP:

public class OrderService{    private readonly IEmailService _emailService;    private readonly ILogger _logger;        public OrderService(IEmailService emailService, ILogger logger)    {        _emailService = emailService;        _logger = logger;    }        public void CreateOrder(Order order)    {        // Lógica de creación de pedido        Console.WriteLine("Pedido creado");                _emailService.SendEmail("order@example.com", "Nuevo pedido");        _logger.Log("Pedido creado");    }}

public interface IEmailService{ void SendEmail(string to, string message);}

public class EmailService : IEmailService{ public void SendEmail(string to, string message) { Console.WriteLine($"Email enviado a {to}"); }}

public interface ILogger{ void Log(string message);}

public class FileLogger : ILogger{ public void Log(string message) { File.WriteAllText("log.txt", message); }}


Ahora cada clase es responsable solo de su tarea: OrderService — de la gestión del pedido, EmailService — del envío de correos, FileLogger — del registro.



2. Open-Closed Principle (OCP) — Principio de abierto/cerrado



Teoría: Las entidades de software (clases, módulos, funciones) deben estar abiertas para extensión, pero cerradas para modificación.



Práctica en C#: Usamos herencia e interfaces para extender la funcionalidad sin cambiar el código existente.



Violación de OCP:

public class PaymentProcessor{    public void ProcessPayment(string paymentType, decimal amount)    {        if (paymentType == "CreditCard")        {            // Procesamiento de tarjeta de crédito        }        else if (paymentType == "PayPal")        {            // Procesamiento de PayPal        }        // Agregar un nuevo tipo requiere modificar la clase    }}


Corrección cumpliendo OCP:

public interface IPaymentMethod{    void Process(decimal amount);}

public class CreditCardPayment : IPaymentMethod{ public void Process(decimal amount) { Console.WriteLine($"Procesando tarjeta de crédito: {amount}"); }}

public class PayPalPayment : IPaymentMethod{ public void Process(decimal amount) { Console.WriteLine($"Procesando PayPal: {amount}"); }}

public class PaymentProcessor{ public void ProcessPayment(IPaymentMethod paymentMethod, decimal amount) { paymen

Blogs

Book Recommendations