Sobes.tech
Middle+

Milyen mechanizmusok segítenek betartani az függőségek fordított elvét?

sobes.tech MI

Válasz az MI-től

A függőség fordított elve (Dependency Inversion Principle - DIP) több összefüggő mechanizmus révén valósul meg:

  1. Absztrakciók:

    • Interfészek és absztrakt osztályok szerződéseket határoznak meg, nem konkrét megvalósításokat. A magas szintű modulok ezekre az absztrakciókra támaszkodnak, nem az alacsony szintű konkrét osztályokra.
  2. **Függőség injektálás (Dependency Injection - DI):

    • Ahelyett, hogy egy osztály közvetlenül hozná létre a függőségeit, azokat kívülről adják át neki. Ez megkönnyíti a függőségek megvalósításának cseréjét anélkül, hogy módosítani kellene az osztály kódját.
    • C# szintaxis konstruktoron keresztüli injektáláshoz:
      public class HighLevelModule
      {
          private readonly ILowLevelDependency _dependency; // Absztrakcióra való függőség
      
          public HighLevelModule(ILowLevelDependency dependency) // Konstruktoron keresztüli injektálás
          {
              _dependency = dependency;
          }
      
          public void PerformAction()
          {
              _dependency.Execute(); // Függőség absztrakció használatával
          }
      }
      
    • C# szintaxis tulajdonságon keresztüli injektáláshoz:
      public class AnotherHighLevelModule
      {
          public ILowLevelDependency Dependency { get; set; } // Tulajdonságon keresztüli injektálás
      
          public void PerformAction()
          {
              Dependency?.Execute(); // Függőség absztrakció használatával
          }
      }
      
    • C# szintaxis metóduson keresztüli injektáláshoz:
      public class YetAnotherHighLevelModule
      {
          public void PerformAction(ILowLevelDependency dependency) // Metóduson keresztüli injektálás
          {
              dependency.Execute(); // Függőség absztrakció használatával
          }
      }
      
  3. **IoC-konténerek (Inversion of Control Containers):

    • Keretrendszerek, amelyek automatizálják a függőségek kezelését és injektálását. Ők felelősek az osztálypéldányok létrehozásáért és a függőségek feloldásáért a beállított szabályok szerint.
    • Egy népszerű IoC-konténer (pl. StructureMap) használatának példája:
      // Függőség regisztrálása
      // container.Configure(cfg =>
      // {
      //     cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Absztrakció és konkrét megvalósítás regisztrálása
      //     cfg.For<HighLevelModule>().Use<HighLevelModule>();
      // });
      
      // Az osztály példányának megszerzése a feloldott függőségekkel
      // var highLevelModule = container.GetInstance<HighLevelModule>();
      // highLevelModule.PerformAction();
      
  4. Fabrikák:

    • Osztályok, amelyek más osztálypéldányokat hoznak létre. Elrejthetik a konkrét megvalósítások létrehozásának részleteit, és absztrakciókat adhatnak vissza.
    • C# szintaxis a fabrika használatára példaként:
      public interface ILowLevelDependencyFactory
      {
          ILowLevelDependency Create();
      }
      
      public class LowLevelDependencyFactory : ILowLevelDependencyFactory
      {
          public ILowLevelDependency Create()
          {
              return new ConcreteLowLevelDependency(); // Konkrét megvalósítás létrehozása
          }
      }
      
      public class HighLevelModuleWithFactory
      {
          private readonly ILowLevelDependency _dependency;
      
          public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Fabrika injektálása
          {
              _dependency = factory.Create(); // Fabrikát használva a függőség létrehozására
          }
      
          public void PerformAction()
          {
              _dependency.Execute();
          }
      }
      
  5. A Demeter törvénye (Law of Demeter):

    • Bár nem közvetlen DIP mechanizmus, ennek a principiumnak a betartása (csak a közvetlen "barátokkal" beszélgetés) gyakran csökkenti a közvetlen függőségeket, és megkönnyíti a DIP alkalmazását.