Sobes.tech
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:

  1. 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.
  2. 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
          }
      }
      
  3. 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();
      
  4. 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();
          }
      }
      
  5. 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.