Sobes.tech
Middle+

Qaysi mexanizmlar bog'liqliklarni teskari qilish prinsipini saqlashga yordam beradi?

sobes.tech AI

AIdan javob

Ba'zi bog'liq mexanizmlar yordamida bog'liqliklarni teskari qilish prinsipi (Dependency Inversion Principle - DIP) bajariladi:

  1. Abstraktsiyalar:

    • Interfeyslar va abstrakt sinflar shartnomalarni belgilaydi, aniq implementatsiyalar emas. Yuqori darajadagi modullar ushbu abstraktsiyalarga bog'liq, past darajadagi aniq sinflarga emas.
  2. Bog'liqliklarni inject qilish (Dependency Injection - DI):

    • Bir sinf o'z bog'liqliklarini to'g'ridan-to'g'ri yaratish o'rniga, ularni tashqaridan uzatadi. Bu bog'liqliklarning implementatsiyalarini o'zgartirmasdan o'zgartirish imkonini beradi.
    • C# sintaksisi konstruktor orqali inject qilish uchun:
      public class HighLevelModule
      {
          private readonly ILowLevelDependency _dependency; // Abstraksiyaga bog'liqlik
      
          public HighLevelModule(ILowLevelDependency dependency) // Konstruktor orqali inject
          {
              _dependency = dependency;
          }
      
          public void PerformAction()
          {
              _dependency.Execute(); // Abstraksiyadan bog'liqlikni foydalanish
          }
      }
      
    • C# sintaksisi xususiyat orqali inject qilish uchun:
      public class AnotherHighLevelModule
      {
          public ILowLevelDependency Dependency { get; set; } // Xususiyat orqali inject
      
          public void PerformAction()
          {
              Dependency?.Execute(); // Abstraksiyadan bog'liqlikni foydalanish
          }
      }
      
    • C# sintaksisi metod orqali inject qilish uchun:
      public class YetAnotherHighLevelModule
      {
          public void PerformAction(ILowLevelDependency dependency) // Metod orqali inject
          {
              dependency.Execute(); // Abstraksiyadan bog'liqlikni foydalanish
          }
      }
      
  3. IoC konteynerlar (Inversion of Control Containers):

    • Frameworklar bog'liqliklarni boshqarish va inject qilish jarayonini avtomatlashtiradi. Ular sinf instansiyalarini yaratadi va ularning bog'liqliklarini sozlangan qoidalarga muvofiq hal qiladi.
    • Mashhur IoC konteyneridan foydalanish misoli (masalan, StructureMap):
      // Bog'liqlikni ro'yxatdan o'tkazish
      // container.Configure(cfg =>
      // {
      //     cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Abstraksiyani va uning aniq implementatsiyasini ro'yxatdan o'tkazish
      //     cfg.For<HighLevelModule>().Use<HighLevelModule>();
      // });
      
      // Bog'liqliklar hal qilingan sinf instansiyasini olish
      // var highLevelModule = container.GetInstance<HighLevelModule>();
      // highLevelModule.PerformAction();
      
  4. Fabrikalar:

    • Boshqa sinflarning instansiyalarini yaratadigan sinflar. Ular aniq implementatsiyalar yaratish tafsilotlarini yashirishi va abstraktsiyalarni qaytarishi mumkin.
    • Fabrikadan foydalanish uchun C# sintaksisi misoli:
      public interface ILowLevelDependencyFactory
      {
          ILowLevelDependency Create();
      }
      
      public class LowLevelDependencyFactory : ILowLevelDependencyFactory
      {
          public ILowLevelDependency Create()
          {
              return new ConcreteLowLevelDependency(); // Aniq implementatsiya yaratish
          }
      }
      
      public class HighLevelModuleWithFactory
      {
          private readonly ILowLevelDependency _dependency;
      
          public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Fabrika inject
          {
              _dependency = factory.Create(); // Fabrika yordamida bog'liqlikni yaratish
          }
      
          public void PerformAction()
          {
              _dependency.Execute();
          }
      }
      
  5. Demeter qonuni (Law of Demeter):

    • Garchi bu DIPning to'g'ridan-to'g'ri mexanizmi bo'lmasa-da, bu prinsipga rioya qilish (faqat "o'z do'stlaringiz bilan" gaplashish) odatda to'g'ridan-to'g'ri bog'liqliklarni kamaytiradi va DIPni qo'llashni osonlashtiradi.