Зачем нужно понижать связанность кода
Что проверяют
Понимаете ли вы, во что обходится высокая связанность в живом проекте, а не только помните формулу «low coupling, high cohesion». Интервьюер ждёт конкретики: какие зависимости вредны, как их увидеть в коде на C# и чем развязывать. Следом часто спрашивают, не бывает ли интерфейсов слишком много.
Как отвечать
Связанность это то, насколько изменение одного модуля заставляет менять другие. Понижать её нужно не ради красоты, а ради трёх вещей:
- локальность изменений: правка формата платежа не должна тянуть за собой контроллеры, отчёты и тесты в пяти проектах;
- тестируемость: класс, который сам делает
new SqlConnection(...)или читаетDateTime.Now, в юнит-тесте не изолировать. Если время приходит черезTimeProvider(появился в .NET 8), а данные через интерфейс репозитория, тест подставляет фейки; - независимая работа и замена частей: команды меняют модули параллельно, а реализацию (другой брокер, другой платёжный провайдер) можно заменить без переписывания бизнес-логики.
Инструменты в .NET: зависимости через конструктор и встроенный контейнер Microsoft.Extensions.DependencyInjection, интерфейсы на границах слоёв, события или медиатор между модулями, модификатор internal и отдельные сборки, чтобы детали модуля не утекали наружу. Увидеть проблему помогают метрика Class Coupling в Code Metrics Visual Studio и NDepend.
Хорошо добавить, что свести связанность к нулю нельзя: модули всё равно взаимодействуют. Задача в том, чтобы зависимости шли через узкие стабильные контракты, а внутри модуля держалась высокая связность (cohesion).
Приведите пример из своей практики: что было трудно поменять и что изменилось после развязки. Нужны ваши реальные случаи.
Где спотыкаются
Заводят интерфейс на каждый класс с одной реализацией. Код не становится менее связанным, просто каждое изменение теперь правится в двух местах.
Вызывают IServiceProvider.GetService прямо в бизнес-коде. Это Service Locator: зависимость никуда не делась, её просто не видно в конструкторе.
Путают связанность (coupling) и связность (cohesion) и отвечают про одно, когда спрашивают про другое.