Sobes.tech
Middle+

Asılılıqların tərs çevrilməsi prinsipinə riayət etməyə kömək edən mexanizmlər hansılardır?

sobes.tech Süni İntellekt

AI-dan cavab

Asılılıq İnversiyası Prinsipi (Dependency Inversion Principle - DIP), bir neçə qarşılıqlı əlaqəli mexanizm vasitəsilə təmin edilir:

  1. Abstraksiyalar:

    • İnterfeyslər və abstrakt siniflər müqavilələri müəyyən edir, konkret tətbiqləri deyil. Yüksək səviyyəli modullar bu abstraksiyalara, aşağı səviyyəli konkret siniflərə deyil, asılıdır.
  2. **Asılılıq İnteqrasiyası (Dependency Injection - DI):

    • Sinif öz asılılıqlarını birbaşa yaratmaq yerinə, onlara xaricdən ötürür. Bu, asılılıqların tətbiqlərini dəyişdirmədən asanlıqla dəyişdirməyə imkan verir.
    • C# sintaksisi ilə konstruktor vasitəsilə inject etmək:
      public class HighLevelModule
      {
          private readonly ILowLevelDependency _dependency; // Abstraksiyaya asılılıq
      
          public HighLevelModule(ILowLevelDependency dependency) // Konstruktor vasitəsilə inject
          {
              _dependency = dependency;
          }
      
          public void PerformAction()
          {
              _dependency.Execute(); // Abstraksiya vasitəsilə asılılığın istifadəsi
          }
      }
      
    • C# sintaksisi ilə xüsusiyyət vasitəsilə inject etmək:
      public class AnotherHighLevelModule
      {
          public ILowLevelDependency Dependency { get; set; } // Xüsusiyyət vasitəsilə inject
      
          public void PerformAction()
          {
              Dependency?.Execute(); // Abstraksiya vasitəsilə asılılığın istifadəsi
          }
      }
      
    • C# sintaksisi ilə metod vasitəsilə inject etmək:
      public class YetAnotherHighLevelModule
      {
          public void PerformAction(ILowLevelDependency dependency) // Metod vasitəsilə inject
          {
              dependency.Execute(); // Abstraksiya vasitəsilə asılılığın istifadəsi
          }
      }
      
  3. IoC konteynerləri (Inversion of Control Containers):

    • Asılılıqları və inject etmə prosesini avtomatlaşdıran çərçivələr. Onlar sinif nümunələrinin yaradılmasını və konfiqurasiya olunmuş qaydalara uyğun olaraq asılılıqların həllini təmin edir.
    • Məşhur IoC konteynerinin (məsələn, StructureMap) istifadəsi nümunəsi:
      // Asılılığın qeydiyyatı
      // container.Configure(cfg =>
      // {
      //     cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Abstraksiya və onun konkret tətbiqi
      //     cfg.For<HighLevelModule>().Use<HighLevelModule>();
      // });
      
      // Asılılıqları həll edən sinif nümunəsinin alınması
      // var highLevelModule = container.GetInstance<HighLevelModule>();
      // highLevelModule.PerformAction();
      
  4. Fabrika:

    • Digər sinif nümunələrinin yaradılmasından məsul olan siniflər. Onlar konkret tətbiqlərin yaradılma detallarını gizlədə və abstraksiyalar qaytarə bilər.
    • Fabrika istifadəsi üçün C# nümunəsi:
      public interface ILowLevelDependencyFactory
      {
          ILowLevelDependency Create();
      }
      
      public class LowLevelDependencyFactory : ILowLevelDependencyFactory
      {
          public ILowLevelDependency Create()
          {
              return new ConcreteLowLevelDependency(); // Konkret tətbiqin yaradılması
          }
      }
      
      public class HighLevelModuleWithFactory
      {
          private readonly ILowLevelDependency _dependency;
      
          public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Fabrika vasitəsilə inject
          {
              _dependency = factory.Create(); // Fabrikadan istifadə ilə asılılığın yaradılması
          }
      
          public void PerformAction()
          {
              _dependency.Execute();
          }
      }
      
  5. Ən az bilik prinsipi (Law of Demeter):

    • Bu, birbaşa DIP mexanizmi olmasa da, bu prinsipə riayət etmək (yalnız "dostlar" ilə danışmaq) adətən birbaşa asılılıqları azaldır və nəticədə DIP-in tətbiqini asanlaşdırır.