Sobes.tech
Middle+

Koji mehanizmi pomažu u poštivanju principa inverzije zavisnosti?

sobes.tech АИ

Одговор од АИ

Princip inverzije zavisnosti (Dependency Inversion Principle - DIP) se sprovodi pomoću nekoliko međusobno povezanih mehanizama:

  1. Apstrakcije:

    • Interfejsi i apstraktne klase definišu ugovore, a ne konkretne implementacije. Moduli visokog nivoa zavise od ovih apstrakcija, a ne od niskonivojskih konkretnih klasa.
  2. **Umetanje zavisnosti (Dependency Injection - DI):

    • Umesto da klasa direktno kreira svoje zavisnosti, one joj se prosleđuju spolja. Ovo omogućava lako zamenjivanje implementacija zavisnosti bez promene koda same klase.
    • C# sintaksa za injektovanje putem konstruktora:
      public class HighLevelModule
      {
          private readonly ILowLevelDependency _dependency; // Zavisnost od apstrakcije
      
          public HighLevelModule(ILowLevelDependency dependency) // Injektovanje putem konstruktora
          {
              _dependency = dependency;
          }
      
          public void PerformAction()
          {
              _dependency.Execute(); // Korišćenje zavisnosti putem apstrakcije
          }
      }
      
    • C# sintaksa za injektovanje putem svojstva:
      public class AnotherHighLevelModule
      {
          public ILowLevelDependency Dependency { get; set; } // Injektovanje putem svojstva
      
          public void PerformAction()
          {
              Dependency?.Execute(); // Korišćenje zavisnosti putem apstrakcije
          }
      }
      
    • C# sintaksa za injektovanje putem metode:
      public class YetAnotherHighLevelModule
      {
          public void PerformAction(ILowLevelDependency dependency) // Injektovanje putem metode
          {
              dependency.Execute(); // Korišćenje zavisnosti putem apstrakcije
          }
      }
      
  3. **IoC kontejnere (Inversion of Control Containers):

    • Okviri koji automatizuju proces upravljanja zavisnostima i injektovanjem. Oni su zaduženi za kreiranje instanci klasa i rešavanje njihovih zavisnosti prema podešenim pravilima.
    • Primer korišćenja popularnog IoC kontejnera (npr. StructureMap):
      // Registracija zavisnosti
      // container.Configure(cfg =>
      // {
      //     cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Registracija apstrakcije i njene konkretne implementacije
      //     cfg.For<HighLevelModule>().Use<HighLevelModule>();
      // });
      
      // Dobijanje instance klase sa rešenim zavisnostima
      // var highLevelModule = container.GetInstance<HighLevelModule>();
      // highLevelModule.PerformAction();
      
  4. Fabrike:

    • Klase koje su zadužene za kreiranje instanci drugih klasa. One mogu skrivati detalje kreiranja konkretnih implementacija i vraćati apstrakcije.
    • C# sintaksa za primer korišćenja fabrike:
      public interface ILowLevelDependencyFactory
      {
          ILowLevelDependency Create();
      }
      
      public class LowLevelDependencyFactory : ILowLevelDependencyFactory
      {
          public ILowLevelDependency Create()
          {
              return new ConcreteLowLevelDependency(); // Kreiranje konkretne implementacije
          }
      }
      
      public class HighLevelModuleWithFactory
      {
          private readonly ILowLevelDependency _dependency;
      
          public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Injektovanje fabrike
          {
              _dependency = factory.Create(); // Korišćenje fabrike za kreiranje zavisnosti
          }
      
          public void PerformAction()
          {
              _dependency.Execute();
          }
      }
      
  5. Zakon najmanjih znanja (Law of Demeter):

    • Iako nije direktan mehanizam DIP, pridržavanje ovog principa (govoriti samo sa svojim neposrednim "prijateljima") često dovodi do smanjenja direktnih zavisnosti i olakšava primenu DIP.