SOLID - это акроним пяти ключевых принципов объектно-ориентированного программирования и проектирования, которые помогают создавать гибкий, поддерживаемый и масштабируемый код.
public class UserService
{
// Нарушение SRP - класс делает слишком много
public void RegisterUser(User user) { /*...*/ }
public void SendEmail(User user, string message) { /*...*/ }
public void LogError(string error) { /*...*/ }
}
public class GoodUserService
{
public void RegisterUser(User user) { /*...*/ }
}
public class EmailService
{
public void SendEmail(User user, string message) { /*...*/ }
}
public class Logger
{
public void LogError(string error) { /*...*/ }
}
Суть: Класс должен иметь только одну причину для изменения, то есть только одну ответственность.
public abstract class Shape
{
public abstract double Area();
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public override double Area() => Width * Height;
}
public class Circle : Shape
{
public double Radius { get; set; }
public override double Area() => Math.PI * Radius * Radius;
}
Суть: Программные сущности должны быть открыты для расширения, но закрыты для модификации.
public class Bird
{
public virtual void Fly() { /*...*/ }
}
public class Duck : Bird { }
public class Ostrich : Bird
{
public override void Fly()
{
throw new NotSupportedException("Страусы не летают!");
}
}
Проблема: Нарушение LSP, так как Ostrich не может заменить Bird без изменения поведения.
Суть: Подтипы должны быть заменяемыми для своих базовых типов без изменения корректности программы.
// Плохой интерфейс
public interface IWorker
{
void Work();
void Eat();
void Sleep();
}
// Хорошие специализированные интерфейсы
public interface IWorkable
{
void Work();
}
public interface IEatable
{
void Eat();
}
Суть: Клиенты не должны зависеть от методов, которые они не используют. Лучше много специализированных интерфейсов, чем один универсальный.
public class BusinessLogic
{
private IRepository _repository;
public BusinessLogic(IRepository repository)
{
_repository = repository;
}
public void DoWork()
{
var data = _repository.GetData();
// ...
}
}
public interface IRepository
{
object GetData();
}
public class SqlRepository : IRepository { /*...*/ }
public class FileRepository : IRepository { /*...*/ }
Суть:
SOLID - это не догма, а инструмент для создания качественного кода. Важно понимать суть каждого принципа и применять его осознанно, учитывая конкретные требования проекта.