В программировании есть известная концепция, которая считается лучшей практикой, называемая слабой связью. Но прежде чем мы перейдем к тому, что такое слабая связь и почему она так известна: мы должны сначала понять ее противоположность — и что считается плохой практикой — тесная связь. Но прежде всего, что вообще означает связь в программировании?

Связь в программировании

Сцепление относится к зависимости одного класса от другого. Таким образом, если один из двух классов сильно зависит от другого, то они сильно связаны, если нет — слабо связаны.

Почему именно тесная связь в реальном коде?

class MyLaptop{
   NvidiaDisplayCard nvidiaDisplayCard = new NvidiaDisplayCard();
   SamsungRam samsungRam = new SamsungRam();
   
  public void startLaptop(){
   nvidiaDisplayCard.startNvidiaCard();
   samsungRam.startSamsungRam();
  }
}

На первый взгляд этот код выглядит нормально, не так ли? Он отлично работает. Но минус в долгосрочной перспективе. Предположим, я хочу использовать другую марку видеокарты, например AMD Radeon, или другую марку оперативной памяти, например Patriot, тогда мне нужно изменить всю структуру класса MyLaptop. Вы видите проблему? MyLaptop сильно зависит от класса NvidiaDisplayCard и SamsungRam. И именно это мешает нам легко изменить свой выбор. И это создаст большие проблемы с обслуживанием и тестированием нашего кода.

Что мы можем сделать?

Мы можем использовать интерфейсы (если у вас есть проблемы с пониманием интерфейсов, вы можете прочитать мою предыдущую статью об абстракции)

class MyLaptop{
   DisplayCard displayCard= new NvidiaDisplayCard();
   Ram ram = new SamsungRam();
   
  public void startLaptop(){
   displayCard.start();
   ram.startSamsungRam();
 }
}

Итак, в приведенном выше коде прекрасно то, что если мы хотим изменить компоненты нашего ноутбука, мы можем легко это сделать. Предположим, мы хотим использовать видеокарту AMD Radeon, мы можем легко заменить NvdiaDisplayCard объектом AmdRadeonDisplayCard без изменения какого-либо кода в происхождении класса MyLaptop. Таким образом, MyLaptop становится менее зависимым от класса NvidiaDisplayCard, потому что он может легко изменить его на другой объект. Таким образом, мы создали более удобный и тестируемый класс.