Middle+
Bağımlılıkların Tersine Çevrilmesi İlkesini korumaya yardımcı olan mekanizmalar nelerdir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Bağımlılıkların Ters Çevirisi İlkesi (Dependency Inversion Principle - DIP), birkaç birbirine bağlı mekanizma ile sağlanır:
-
Soyutlamalar:
- Arabirimler ve soyut sınıflar sözleşmeleri tanımlar, somut uygulamaları değil. Yüksek seviyeli modüller bu soyutlamalara bağlıdır, düşük seviyeli somut sınıflara değil.
-
Bağımlılık Enjeksiyonu (Dependency Injection - DI):
- Bir sınıf doğrudan bağımlılıklarını oluşturmak yerine, bunlar dışarıdan kendisine aktarılır. Bu, bağımlılıkların uygulamalarını kolayca değiştirmeye olanak tanır, sınıfın kodunu değiştirmeden.
- C# ile yapıcı (constructor) aracılığıyla enjeksiyon sözdizimi:
public class HighLevelModule { private readonly ILowLevelDependency _dependency; // Soyutlamaya bağımlılık public HighLevelModule(ILowLevelDependency dependency) // Yapıcı aracılığıyla enjeksiyon { _dependency = dependency; } public void PerformAction() { _dependency.Execute(); // Soyutlama aracılığıyla bağımlılığı kullanma } } - C# ile özellik (property) aracılığıyla enjeksiyon sözdizimi:
public class AnotherHighLevelModule { public ILowLevelDependency Dependency { get; set; } // Özellik aracılığıyla enjeksiyon public void PerformAction() { Dependency?.Execute(); // Soyutlama aracılığıyla bağımlılığı kullanma } } - C# ile metod aracılığıyla enjeksiyon sözdizimi:
public class YetAnotherHighLevelModule { public void PerformAction(ILowLevelDependency dependency) // Metod aracılığıyla enjeksiyon { dependency.Execute(); // Soyutlama aracılığıyla bağımlılığı kullanma } }
-
IoC kapsayıcıları (Inversion of Control Containers):
- Bağımlılıkların yönetimi ve enjeksiyonunu otomatikleştiren çerçeveler. Sınıf örnekleri oluşturur ve yapılandırılmış kurallara göre bağımlılıklarını çözerler.
- Popüler bir IoC kapsayıcısının kullanımı örneği (örneğin, StructureMap):
// Bağımlılık kaydı // container.Configure(cfg => // { // cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Soyutlama ve somut uygulama kaydı // cfg.For<HighLevelModule>().Use<HighLevelModule>(); // }); // Bağımlılıkları çözülmüş sınıf örneği alma // var highLevelModule = container.GetInstance<HighLevelModule>(); // highLevelModule.PerformAction();
-
Fabrikalar:
- Diğer sınıfların örneklerini oluşturan sınıflar. Belirli uygulamaların detaylarını gizleyebilir ve soyutlamalar dönebilirler.
- Fabrika kullanımına örnek C# sözdizimi:
public interface ILowLevelDependencyFactory { ILowLevelDependency Create(); } public class LowLevelDependencyFactory : ILowLevelDependencyFactory { public ILowLevelDependency Create() { return new ConcreteLowLevelDependency(); // Somut uygulama oluşturma } } public class HighLevelModuleWithFactory { private readonly ILowLevelDependency _dependency; public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Fabrika enjeksiyonu { _dependency = factory.Create(); // Fabrika kullanarak bağımlılığı oluşturma } public void PerformAction() { _dependency.Execute(); } }
-
Demeter Yasası (Law of Demeter):
- Doğrudan DIP mekanizması olmamakla birlikte, bu prensibi (sadece "yakın arkadaşlarınızla" konuşmak) takip etmek, genellikle doğrudan bağımlılıkları azaltır ve DIP uygulamasını kolaylaştırır.