Связность - это мера того, насколько элементы внутри одного модуля (класса, компонента) связаны между собой и работают для достижения единой цели.
// Пример высокой связности
public class MathCalculator
{
public double Add(double a, double b) => a + b;
public double Subtract(double a, double b) => a - b;
public double Multiply(double a, double b) => a * b;
}
// Пример низкой связности (антипаттерн)
public class GodClass
{
public void CalculateInterest() { /*...*/ }
public void PrintDocument() { /*...*/ }
public void ConnectToDatabase() { /*...*/ }
}
Связанность - это мера зависимости между модулями. Показывает, насколько изменения в одном модуле влияют на другие.
// Пример слабой связанности
public interface ILogger
{
void Log(string message);
}
public class OrderProcessor
{
private readonly ILogger _logger;
public OrderProcessor(ILogger logger) // DI
{
_logger = logger;
}
}
// Пример сильной связанности
public class OrderProcessor
{
private readonly FileLogger _logger = new FileLogger();
public void Process(Order order)
{
// ...
_logger.WriteToFile("Order processed");
}
}
Золотое правило: Стремитесь к высокой связности и слабой связанности внутри системы.
Плохой дизайн:
public class ReportManager
{
public void GenerateReport()
{
var data = new Database().GetData(); // Сильная связанность
var pdf = new PdfGenerator().Create(data);
new EmailService().Send(pdf);
}
}
Хороший дизайн:
public class ReportGenerator
{
private readonly IDataProvider _dataProvider;
private readonly IDocumentBuilder _documentBuilder;
public ReportGenerator(IDataProvider provider, IDocumentBuilder builder)
{
_dataProvider = provider;
_documentBuilder = builder;
}
public Report Generate() // Высокая связность
{
var data = _dataProvider.GetData();
return _documentBuilder.Build(data);
}
}
понимание и правильное применение принципов связности и связанности критически важно для создания поддерживаемых, тестируемых и масштабируемых систем. Высокая связность и слабая связанность - это индикаторы качественного объектно-ориентированного дизайна, которые напрямую влияют на гибкость и долгосрочную жизнеспособность кодовой базы.