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