Middle+
Кай механизмдер көзкарандылық принцибин сактоо үчүн жардам берет?
sobes.tech AI
AIден жооп
Көзкаранды күчүрүү принциби (Dependency Inversion Principle - DIP) бир нече өз ара байланышкан механизмдер аркылуу ишке ашырылат:
-
Абстракциялар:
- Интерфейстер жана абстракттуу класстар келишимдерди аныктайт, конкреттүү ишке ашырууларды эмес. Жогорку деңгээлдеги модулдар бул абстракциялардан көз каранды, төмөнкү деңгээлдеги конкреттүү класстардан эмес:
-
Көзкарандыулукту киргизүү (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(); // Абстракция аркылуу көзкарандыулукту колдонуу } }
-
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();
-
Фабрикалар:
- Башка класстардын экземплярларын түзүү үчүн жооптуу класстар. Алар конкреттүү ишке ашырылыштарды жашырышы жана абстракциялар кайтаруусу мүмкүн:
- 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(); } }
-
Деметер мыйзамы (Law of Demeter):
- Бул DIP түз механизм эмес болсо да, бул принципти сактоо (тек өзүнүн "достору" менен сүйлөшүү) көбүнесе түз көзкарандыулуктарды азайтууга жана DIP колдонууга жеңилдик берет: