Sobes.tech
Middle+

Кадом механизмҳо кӯмак мекунанд, ки принсипи ислоҳ кардани вобастагиро риоя кунанд?

sobes.tech AI

Ҷавоб аз AI

Принципи и inversion of dependencies (Dependency Inversion Principle - DIP) тавассути чанд механизмҳои ҳамоҳангшуда таъмин карда мешавад:

  1. Абстраксияҳо:

    • Интерфейсҳо ва синфҳои абстрактӣ шартномаҳоро муайян мекунанд, на иҷроиҳои мушаххас. Модулҳои сатҳи баланд ба ин абстраксияҳо вобастаанд, на ба синфҳои мушаххас дар сатҳи поён.
  2. **Вуруд кардани вобастагиҳо (Dependency Injection - DI):

    • Ба ҷои он, ки синф мустақиман вобастагиҳои худро созад, онҳо аз берун ба он дода мешаванд. Ин имкон медиҳад, ки иҷроиҳои вобастагиҳоро бидуни тағир додани коди синф ба осонӣ иваз кардан мумкин аст.
    • Синтаксис дар C# барои ворид кардани тавассути конструктор:
      public class HighLevelModule
      {
          private readonly ILowLevelDependency _dependency; // Вобастагӣ ба абстраксия
      
          public HighLevelModule(ILowLevelDependency dependency) // Вуруд тавассути конструктор
          {
              _dependency = dependency;
          }
      
          public void PerformAction()
          {
              _dependency.Execute(); // Истифодаи вобастагӣ тавассути абстраксия
          }
      }
      
    • Синтаксис дар C# барои ворид кардан тавассути хусусият:
      public class AnotherHighLevelModule
      {
          public ILowLevelDependency Dependency { get; set; } // Вуруд тавассути хусусият
      
          public void PerformAction()
          {
              Dependency?.Execute(); // Истифодаи вобастагӣ тавассути абстраксия
          }
      }
      
    • Синтаксис дар C# барои ворид кардан тавассути усул:
      public class YetAnotherHighLevelModule
      {
          public void PerformAction(ILowLevelDependency dependency) // Вуруд тавассути усул
          {
              dependency.Execute(); // Истифодаи вобастагӣ тавассути абстраксия
          }
      }
      
  3. **Контейнерҳои IoC (Inversion of Control Containers):

    • Фреймворкҳо, ки равандро автоматӣ мекунанд ва идоракунии вобастагиҳоро таъмин мекунанд. Онҳо масъуланд барои сохтани намунаҳои синфҳо ва ҳал кардани вобастагиҳои онҳо мувофиқи қоидаҳои танзимшуда.
    • Мисоли истифодаи контейнери IoC машҳур (масалан, StructureMap):
      // Ворид кардани вобастагӣ
      // container.Configure(cfg =>
      // {
      //     cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Ворид кардани абстраксия ва иҷрои мушаххас
      //     cfg.For<HighLevelModule>().Use<HighLevelModule>();
      // });
      
      // Гирифтани намунаи синф бо вобастагиҳои ҳалшуда
      // var highLevelModule = container.GetInstance<HighLevelModule>();
      // highLevelModule.PerformAction();
      
  4. Фабрикаҳо:

    • Синфҳо, ки масъуланд барои сохтани намунаҳои синфҳои дигар. Онҳо метавонанд тафсилоти сохтани иҷроиҳои мушаххасро пинҳон кунанд ва абстраксияҳоро баргардонанд.
    • Синтаксис дар C# барои истифодаи фаbrика ҳамчун мисол:
      public interface ILowLevelDependencyFactory
      {
          ILowLevelDependency Create();
      }
      
      public class LowLevelDependencyFactory : ILowLevelDependencyFactory
      {
          public ILowLevelDependency Create()
          {
              return new ConcreteLowLevelDependency(); // Сохтани иҷрои мушаххас
          }
      }
      
      public class HighLevelModuleWithFactory
      {
          private readonly ILowLevelDependency _dependency;
      
          public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Вуруд аз фабрика
          {
              _dependency = factory.Create(); // Истифодаи фабрика барои сохтани вобастагиӣ
          }
      
          public void PerformAction()
          {
              _dependency.Execute();
          }
      }
      
  5. Қонуни камтарин дониш (Law of Demeter):

    • Гарчанде ки ин механизми мустақим барои DIP нест, риояи ин принсип (гуфтугӯ танҳо бо "дӯстони" мустақим) одатан ба кам кардани вобастагиҳои мустақим ва осон кардани татбиқи DIP мусоидат мекунад.