Sobes.tech
Middle+

Кай механизмдер көзкарандылық принцибин сактоо үчүн жардам берет?

sobes.tech AI

AIден жооп

Көзкаранды күчүрүү принциби (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# синтаксиси аркылуу фабрика колдонуу мисалы:
      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 колдонууга жеңилдик берет: