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:
-
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.
-
**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 } }
-
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();
-
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(); } }
-
Ə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.